Request.Files始终为null

我正在编写一个C#ASP.Net MVC应用程序,以便客户端将文件发布到其他服务器。 我正在使用通用处理程序来处理从客户端到服务器的已发布文件。 但是在我的处理程序中,System.Web.HttpContext.Current.Request.Files总是为空(0计数)。

表格代码:

@model ITDB102.Models.UploadFileResultsModels @{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

Upload File

@section scripts{ // Variable to store your files var files; var form = document.getElementById('file-form'); // Add events $('input[type=file]').on('change', prepareUpload); // Grab the files and set them to our variable function prepareUpload(event) { files = $('#FilePath').get(0).files; } form.onsubmit = function (event) { uploadFiles(event); } // Catch the form submit and upload the files function uploadFiles(event) { event.stopPropagation(); // Stop stuff happening event.preventDefault(); // Totally stop stuff happening // Create a formdata object and add the files var data = new FormData(); if (files.lenght > 0) { data.append('UploadedFiles', files[0], file[0].name); } //setup request var xhr = new XMLHttpRequest(); //open connection xhr.open('POST', '/Files/UploadFile',false); xhr.setRequestHeader("Content-Type", files.type); //send request xhr.send(data); } }

处理器:

 ///  /// Uploads the file. ///  ///  [HttpPost] public virtual ActionResult UploadFile() { HttpPostedFile myFile = System.Web.HttpContext.Current.Request.Files["UploadedFiles"]; bool isUploaded = false; string message = "File upload failed"; if (myFile != null && myFile.ContentLength != 0) { string pathForSaving = Server.MapPath("~/Uploads"); if (this.CreateFolderIfNeeded(pathForSaving)) { try { myFile.SaveAs(Path.Combine(pathForSaving, myFile.FileName)); isUploaded = true; message = "File uploaded successfully!"; } catch (Exception ex) { message = string.Format("File upload failed: {0}", ex.Message); } } } return Json(new { isUploaded = isUploaded, message = message }, "text/html"); } #region Private Methods ///  /// Creates the folder if needed. ///  /// The path. ///  private bool CreateFolderIfNeeded(string path) { bool result = true; if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception) { /*TODO: You must process this exception.*/ result = false; } } return result; } #endregion 

请帮我。 谢谢。

最后,我发现了这个问题。

代码var myFile = System.Web.HttpContext.Current.Request.Files["UploadedFiles"]; 在我的控制器中由于某种原因永远不会工作。 我的ajax没有任何问题。 我在控制器中更改了我的代码,现在正在查找。

 [HttpPost] public virtual ActionResult UploadFile() { //var myFile = System.Web.HttpContext.Current.Request.Files["UploadedFiles"]; // bool isUploaded = false; string message = "File upload failed"; for (int i = 0; i < Request.Files.Count; i++ ) { var myFile = Request.Files[i]; if (myFile != null && myFile.ContentLength != 0) { string pathForSaving = Server.MapPath("~/Uploads"); if (this.CreateFolderIfNeeded(pathForSaving)) { try { myFile.SaveAs(Path.Combine(pathForSaving, myFile.FileName)); isUploaded = true; message = "File uploaded successfully!"; } catch (Exception ex) { message = string.Format("File upload failed: {0}", ex.Message); } } } } return Json(new { isUploaded = isUploaded, message = message }, "text/html"); } #endregion #region Private Methods ///  /// Creates the folder if needed. ///  /// The path. ///  private bool CreateFolderIfNeeded(string path) { bool result = true; if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception) { /*TODO: You must process this exception.*/ result = false; } } return result; } #endregion } 

您需要为xhr设置以下内容。

 dataType: 'json', contentType: false, processData: false, 

请参阅帮助链接 – 使用带有Ajax的MVC 4进行文件上载

我看到了,你已经包含了jquery库并使用了jquery选择器,所以为什么不使用$.ajax进行POST请求呢? 如果您对jquery方式感兴趣,以下是脚本。

 $.ajax({ type: "POST", url: '/Files/UploadFile', data: data, dataType: 'json', contentType: false, processData: false, success: function(response) { alert('succes!!'); }, error: function(param1,param2,param3) { alert("errror"); } }); 

要发布文件,发布数据必须采用multipart / form-data编码类型。 因此,您必须设置请求标头,如下所示:

xhr.setRequestHeader(“内容类型”,“多部分/格式数据”);

请参阅示例: 使用Ajax XmlHttpRequest上载文件