jQuery ajax загрузить файл в asp.net mvc
у меня есть файл в моем представлении
<form id="upload" enctype="multipart/form-data">
<input type="file" name="fileUpload" id="fileUpload" size="23" />
</form>
и запрос ajax
$.ajax({
url: '<%=Url.Action("JsonSave","Survey") %>',
dataType: 'json',
processData: false,
contentType: "multipart/mixed",
data: {
Id: selectedRow.Id,
Value: 'some date was added by the user here :))'
},
cache: false,
success: function (data) {}
});
но там нет файла в запрос.Файлы. Что случилось с запросом ajax?
5 ответов:
загрузка файлов с помощью AJAX in ASP.Net MVC
все изменилось с HTML5
JavaScript
document.getElementById('uploader').onsubmit = function () { var formdata = new FormData(); //FormData object var fileInput = document.getElementById('fileInput'); //Iterating through each files selected in fileInput for (i = 0; i < fileInput.files.length; i++) { //Appending each file to FormData object formdata.append(fileInput.files[i].name, fileInput.files[i]); } //Creating an XMLHttpRequest and sending var xhr = new XMLHttpRequest(); xhr.open('POST', '/Home/Upload'); xhr.send(formdata); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } } return false; }контроллер
public JsonResult Upload() { for (int i = 0; i < Request.Files.Count; i++) { HttpPostedFileBase file = Request.Files[i]; //Uploaded file //Use the following properties to get file's name, size and MIMEType int fileSize = file.ContentLength; string fileName = file.FileName; string mimeType = file.ContentType; System.IO.Stream fileContent = file.InputStream; //To save file, use SaveAs method file.SaveAs(Server.MapPath("~/")+ fileName ); //File will be saved in application root } return Json("Uploaded " + Request.Files.Count + " files"); }EDIT: HTML
<form id="uploader"> <input id="fileInput" type="file" multiple> <input type="submit" value="Upload file" /> </form>
загрузка файлов AJAX теперь возможна путем передачи
FormDataобъектdataсвойства$.ajaxзапрос.поскольку OP специально попросил реализацию jQuery, здесь вы идете:
<form id="upload" enctype="multipart/form-data" action="@Url.Action("JsonSave", "Survey")" method="POST"> <input type="file" name="fileUpload" id="fileUpload" size="23" /><br /> <button>Upload!</button> </form>$('#upload').submit(function(e) { e.preventDefault(); // stop the standard form submission $.ajax({ url: this.action, type: this.method, data: new FormData(this), cache: false, contentType: false, processData: false, success: function (data) { console.log(data.UploadedFileCount + ' file(s) uploaded successfully'); }, error: function(xhr, error, status) { console.log(error, status); } }); });public JsonResult Survey() { for (int i = 0; i < Request.Files.Count; i++) { var file = Request.Files[i]; // save file as required here... } return Json(new { UploadedFileCount = Request.Files.Count }); }подробнее о FormData в MDN
вы не можете загружать файлы через ajax, вам нужно использовать iFrame или какой-либо другой трюк, чтобы сделать полную обратную передачу. В основном это связано с соображениями безопасности.
вот приличная запись, включая образец проекта С помощью SWFUpload и ASP.Net MVC от Стива Сандерсона. Это первое, что я прочитал, чтобы это работало правильно Asp.Net MVC (я был новичком в MVC в то время), надеюсь, это так же полезно для вас.
Если вы отправляете форму с помощью ajax, то вы не можете отправить изображение с помощью $.ajax метод, вы должны использовать классический метод xmlHttpobject для сохранения изображения, другая альтернатива - использовать тип отправки вместо кнопки
У меня есть пример, как это на версии vuejs: v2.5. 2
<form action="url" method="post" enctype="multipart/form-data"> <div class="col-md-6"> <input type="file" class="image_0" name="FilesFront" ref="FilesFront" /> </div> <div class="col-md-6"> <input type="file" class="image_1" name="FilesBack" ref="FilesBack" /> </div> </form> <script> Vue.component('v-bl-document', { template: '#document-item-template', props: ['doc'], data: function () { return { document: this.doc }; }, methods: { submit: function () { event.preventDefault(); var data = new FormData(); var _doc = this.document; Object.keys(_doc).forEach(function (key) { data.append(key, _doc[key]); }); var _refs = this.$refs; Object.keys(_refs).forEach(function (key) { data.append(key, _refs[key].files[0]); }); debugger; $.ajax({ type: "POST", data: data, url: url, cache: false, contentType: false, processData: false, success: function (result) { //do something }, }); } } }); </script>
Comments