2014-10-31 108 views
3

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

表格代号:

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

<div> 
    <h1>Upload File</h1> 
    <form id="file-form" action="/Files/UploadFile" method="post" data-ajax="false" enctype="multipart/form-data"> 
     <div><input type="file" id="FilePath" name="FilePath"/> 
     <button type="submit">Send File</button></div> 
    </form> 
</div> 

@section scripts{ 
    <script src="~/Scripts/jquery-1.10.2.js"></script> 
    <script type="text/javascript"> 

     // 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); 

     } 

    </script> 

} 

处理程序:

/// <summary> 
    /// Uploads the file. 
    /// </summary> 
    /// <returns></returns> 
    [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 

    /// <summary> 
    /// Creates the folder if needed. 
    /// </summary> 
    /// <param name="path">The path.</param> 
    /// <returns></returns> 
    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 

请帮助我。谢谢。

回答

3

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

在我的控制器中的代码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 

    /// <summary> 
    /// Creates the folder if needed. 
    /// </summary> 
    /// <param name="path">The path.</param> 
    /// <returns></returns> 
    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 

} 
-1

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

xhr.setRequestHeader(“Content-Type”,“multipart/form-data”);

请参阅样本:Upload File With Ajax XmlHttpRequest

+0

试过了,它仍然没有工作。在我的表单头部旁边已经包含了代码<... enctype =“multipart/form-data”>。 – BNguyen 2014-11-03 19:04:57

1

您需要设置以下为xhr

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

参见帮助链接 - File upload using MVC 4 with Ajax

我看到,你已经包括jquery库和使用jquery选择,那么你为什么不使用$.ajaxPOST要求?如果您对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"); 
    } 
}); 
+0

我在一开始就使用了ajax版本,并没有奏效。 – BNguyen 2014-11-03 19:07:29