在 ASP.NET MVC 中通过 JQuery AJAX 上传文件

Posted

技术标签:

【中文标题】在 ASP.NET MVC 中通过 JQuery AJAX 上传文件【英文标题】:File Upload Through JQuery AJAX In ASP.NET MVC 【发布时间】:2021-12-10 16:17:44 【问题描述】:

我需要向候选人发送邀请,其中用户选择 excel 文件,将其从 ajax 传输到控制器并验证其大小、类型等。然后用户单击“发送邀请”按钮并发送电子邮件邀请(具有 excel 文件)。请参考以下代码:

<button type="button" id="bulkuploadButton">Bulk Email Upload</button>
<input type="file" id="ExcelFile" name="ExcelFile" style="display:none" onchange="UploadFile();" onselect="UploadFile();" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />

jquery:

function UploadFile() 
  if (ValidateExcelFile()) 
     var excelFile = document.getElementById('ExcelFile');
     formData = new FormData();
     if (excelFile.files.length > 0) 
        for (var i = 0; i < excelFile.files.length; i++) 
           formData.append('file-' + i, excelFile.files[i]);
        
     
     $.ajax(
       url: url here,
       type: "POST",
       dataType: 'json',
       processData: false,
       contentType: false,
       data: formData,
       success: function (data) 
        // Further Processing
       ,
       error: function (err) 
        //Error
       
     );
   

控制器:

[HttpPost]
public JsonResult MyController(HttpPostedFileBase excelFile)

 if (Request.Files.Count > 0)
 
   foreach (string file in Request.Files)
   
     excelFile = Request.Files[file];
          
   var result = //Call Model here for validation checks and return error msges
   TempData["ExcelFile"] = excelFile; //Store in TempData for further processing
   return Json(result);
      
  return null;

验证已成功完成,现在是时候向候选人发送邀请了:

<button onclick="SendInvite">Send Invitations</button>

jquery:

function SendInvite() 
  //Check validations for other inputs on the page

  //Get the excel file same as above
  var excelFile = document.getElementById('ExcelFile');
  formData = new FormData();
  if (excelFile.files.length > 0) 
    for (var i = 0; i < excelFile.files.length; i++) 
      formData.append('file-' + i, excelFile.files[i]);
    
  
  $.ajax(
    type: "POST",
    url: url here,
    data: JSON.stringify(
           myModel: myModel,
           excelFile: formData
          ),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) 
    ,
    error: function (data) 
    
   );

控制器:

public JsonResult MyController2(MyModel myModel, HttpPostedFileBase excelFile)

 //I tried the same method to get the file but it didn't help me
 if (Request.Files.Count > 0)  //Here Request.Files.Count = 0, it should be = 1 instead
 
  foreach (string file in Request.Files) 
  
    excelFile = Request.Files[file];
  
 

 //I then tied to use TempData but it does not have the excel data

 excelFile = TempData["ExcelFile"] as HttpPostedFileBase;

 //Further processing

从 TempData 获取数据时出现此错误。 ContentLength 为 0 且数据属性为空

TempData 中的数据应该是这样的(其中 ContentLength !=0 并且数据属性有一些价值):

谁能帮我获取控制器 MyController2 中的 excel 数据。

【问题讨论】:

您想通过邮件发送邀请吗?您能否更具体地说明您到底遇到了什么错误? @TBA,我已经指定我想向候选人发送电子邮件邀请。我现在已经为我遇到的错误添加了图片 ***.com/questions/22706663/…希望这会对你有所帮助。 @Neeraj,在excelFileMyController 中获得null 值,因此卡在这里。 使用 ajax 发送文件时可能会出现一些错误,只需直接在附加 formdata 中发送文件检查此***.com/questions/10899384/… 【参考方案1】:

将函数 SendInvite() 更改为:

function SendInvite() 
  //Check validations for other inputs on the page

  //Get the excel file same as above
  var excelFile = document.getElementById('ExcelFile');
  formData = new FormData();

  formData.append("data", JSON.stringify(myModel));

  for (var i = 0; i < excelFile.files.length; i++) 
     var file = ExcelFile.files[i];
     formData.append("excelFile", file);
  
  $.ajax(
    type: "POST",
    url: url here,
    data: formData,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    contentType: false,
    processData: false,
    success: function (data) 
    ,
    error: function (data) 
    
   );

在控制器中

public JsonResult MyController2(string data, HttpPostedFileBase[] excelFile)

 MyModel myModel = JsonConvert.DeserializeObject<MyModel>(data);
 if (Request.Files.Count > 0)  
 
  //Do data processing here
     

 //Further processing

查看此链接How to Pass Image File and Form Data From Ajax to MVC Controller

【讨论】:

以上是关于在 ASP.NET MVC 中通过 JQuery AJAX 上传文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中通过 Ajax 提交表单?

如何在 ASP.NET MVC3 中通过 HTTPS 提供静态文件(在 ~/Content 中)

在 ASP.NET 代码中通过 javascript 重置 Jquery 验证后停止回发

ASP.NET MVC使用jQuery实现Autocomplete

ASP.NET MVC5 :Attribute路由使用详解

ASP.NET MVC5 新特性:Attribute路由使用详解