文件未在 ajax post 上下载响应 .net 核心
file not downloading on ajax post response .net core
我遇到文件响应问题,它没有下载文件,请检查以下包含控制器方法和 Ajax post 调用的代码,
对象是在表单上输入一个来自用户的excel文件,根据条件读取和计算数据并据此得出结果,return文件中的字节数组响应给浏览器。
一切顺利,输入文件工作正常,数据读取工作正常,只是在响应中发出,它没有显示任何错误并且通过所有代码没有错误,文件没有下载。
[HttpPost]
public async Task<ActionResult> UploadCallingDocument(UploadCallingViewModel model)
{
try
{
FormFileCollection files = Request.Form.Files as FormFileCollection;
{
IFormFile file = files[0];
if (file != null && file.Length > 0)
{
var stream = file.OpenReadStream();
var result = await importExportFileManager.KeepAndShareFileAsync(stream);
return File(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Summarized_KeepAndShare_File.xlsx");
}
}
}
catch (Exception ex)
{
//to create error notification
}
return RedirectToAction("UploadCalling");
}
$('form').submit(function (event) {
event.preventDefault();
var formdata = new FormData($(this).get(0));
$.ajax({
url: this.action,
type: this.method,
data: formdata,
processData: false,
contentType: false,
beforeSend: function () {
// Doing some loading gif stuff
//displayBusyIndicator();
},
success: function (data) {
console.log('success');
//hideBusyIndicator();
},
complete: function () {
console.log('complete');
//hideBusyIndicator();
}
});
return false;
});
执行UploadCallingDocument方法后,返回FileContentResult给Ajax成功函数,下载不成功,因为你没有操作成功。所以我添加了一个下载动作,使用 window.location
重定向到控制器中的 Download
动作。
下面的代码我使用序列化 'System.Byte[]' 类型的对象,所以我首先
安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet 包。
然后在 ConfigureServices() 中添加对 AddNewtonsoftJson() 的调用。
services.AddControllersWithViews().AddNewtonsoftJson();
在您的控制器中,像下面这样更改您的代码:
[HttpPost]
public async Task<ActionResult> UploadCallingDocument(UploadCallingViewModel model)
{
try
{
FormFileCollection files = Request.Form.Files as FormFileCollection;
{
IFormFile file = files[0];
if (file != null && file.Length > 0)
{
var stream = file.OpenReadStream();
TempData["file"] = await importExportFileManager.KeepAndShareFileAsync(stream);
return Ok();
}
}
}
catch (Exception ex)
{
//to create error notification
}
return RedirectToAction("UploadCalling");
}
[HttpGet]
public virtual ActionResult Download()
{
byte[] data = TempData["file"] as byte[];
return File(data, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Summarized_KeepAndShare_File.xlsx");
}
在您 ajax 成功后,更改您的代码如下:
success: function (data) {
window.location = '/yourcontrollername/Download';
}
结果:
我遇到文件响应问题,它没有下载文件,请检查以下包含控制器方法和 Ajax post 调用的代码,
对象是在表单上输入一个来自用户的excel文件,根据条件读取和计算数据并据此得出结果,return文件中的字节数组响应给浏览器。
一切顺利,输入文件工作正常,数据读取工作正常,只是在响应中发出,它没有显示任何错误并且通过所有代码没有错误,文件没有下载。
[HttpPost]
public async Task<ActionResult> UploadCallingDocument(UploadCallingViewModel model)
{
try
{
FormFileCollection files = Request.Form.Files as FormFileCollection;
{
IFormFile file = files[0];
if (file != null && file.Length > 0)
{
var stream = file.OpenReadStream();
var result = await importExportFileManager.KeepAndShareFileAsync(stream);
return File(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Summarized_KeepAndShare_File.xlsx");
}
}
}
catch (Exception ex)
{
//to create error notification
}
return RedirectToAction("UploadCalling");
}
$('form').submit(function (event) {
event.preventDefault();
var formdata = new FormData($(this).get(0));
$.ajax({
url: this.action,
type: this.method,
data: formdata,
processData: false,
contentType: false,
beforeSend: function () {
// Doing some loading gif stuff
//displayBusyIndicator();
},
success: function (data) {
console.log('success');
//hideBusyIndicator();
},
complete: function () {
console.log('complete');
//hideBusyIndicator();
}
});
return false;
});
执行UploadCallingDocument方法后,返回FileContentResult给Ajax成功函数,下载不成功,因为你没有操作成功。所以我添加了一个下载动作,使用 window.location
重定向到控制器中的 Download
动作。
下面的代码我使用序列化 'System.Byte[]' 类型的对象,所以我首先
安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
NuGet 包。
然后在 ConfigureServices() 中添加对 AddNewtonsoftJson() 的调用。
services.AddControllersWithViews().AddNewtonsoftJson();
在您的控制器中,像下面这样更改您的代码:
[HttpPost]
public async Task<ActionResult> UploadCallingDocument(UploadCallingViewModel model)
{
try
{
FormFileCollection files = Request.Form.Files as FormFileCollection;
{
IFormFile file = files[0];
if (file != null && file.Length > 0)
{
var stream = file.OpenReadStream();
TempData["file"] = await importExportFileManager.KeepAndShareFileAsync(stream);
return Ok();
}
}
}
catch (Exception ex)
{
//to create error notification
}
return RedirectToAction("UploadCalling");
}
[HttpGet]
public virtual ActionResult Download()
{
byte[] data = TempData["file"] as byte[];
return File(data, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Summarized_KeepAndShare_File.xlsx");
}
在您 ajax 成功后,更改您的代码如下:
success: function (data) {
window.location = '/yourcontrollername/Download';
}
结果: