【发布时间】:2022-01-18 10:14:58
【问题描述】:
我有以下代码来下载文件
jquery
function DownloadExcel() {
var laundrys = new Object();
$.ajax({
type: 'POST',
url: '@Url.Content("Laundry/DownloadExcel")',
data: { laundry: laundrys},
dataType: 'json',
beforeSend: function () {
$("#loadinggif").show();
},
success: function (result) {
$("#loadinggif").hide();
if (result.isuccess) {
GenerateFile(result);
}
else {
Swal.fire('Error Found', result.messageerror, 'error');
}
},
error: function (result) {
$("#loadinggif").hide();
Swal.fire('Unknown Error', result, 'error');
}
});
}
function GenerateFile(result) {
$.fileDownload('@Url.Content("Laundry/GenerateFiles")',
{
httpMethod: "POST",
data: {
folder: result.folder,
filesname: result.filesname
},
successCallback: function (url) {
Swal.fire('Download Success', "", 'success');
},
failCallback: function (responseHtml, url) {
Swal.fire('Download Failed',responseHtml, 'error');
}
});
}
这是我的 c# 中的代码 c#
public JsonResult DownloadExcel(Laundry laundry)
{
bool result = true;
string MsgError = null;
string Folder = null;
string FileName = "GenerateFile-"+ DateTime.Now.ToString("yyyyMMdd_HHmmss").Replace("/", "-")+".xls";
try
{
string startupPath = _webHostEnvironment.WebRootPath;
Folder = startupPath + "\\template\\";
string Path = Folder + "Template.xls";
string NewPath = Folder + FileName;
System.IO.File.Copy(Path, NewPath, true);
HSSFWorkbook workBook;
using (FileStream fs = new FileStream(NewPath, FileMode.Open, FileAccess.Read))
{
workBook = new HSSFWorkbook(fs);
}
//mycode
workBook.SetSheetName(0, "Report Laundry");
using (FileStream fs = new FileStream(NewPath, FileMode.Create, FileAccess.Write))
{
workBook.Write(fs);
fs.Close();
}
}
catch(Exception e)
{
result = false;
MsgError = "Error Exception: " + e.Message;
}
return Json(new { isuccess = result, messageerror = MsgError,folder = Folder, filesname = FileName, });
}
public ActionResult GenerateFiles(string folder, string filesname)
{
string Msg = "success";
try
{
byte[] Data = System.IO.File.ReadAllBytes(folder + filesname);
string contentType;
new FileExtensionContentTypeProvider().TryGetContentType(filesname, out contentType);
HttpContext.Response.Clear();
HttpContext.Response.ContentType = contentType;
HttpContext.Response.Headers.Add("Content-Length", Convert.ToString(Data.Length));
HttpContext.Response.Headers.Add("Content-Disposition", string.Format("{0};FileName=\"{1}\"", "attachment", filesname));
HttpContext.Response.Headers.Add("Set-Cookie", "fileDownload=true; path=/");
HttpContext.Response.Body.WriteAsync(Data);
}
catch(Exception e)
{
Msg = "error Exception : "+e.Message;
}
System.IO.File.Delete(folder + filesname);
return Json(Msg);
}
当我使用以下代码时,下载成功但文件未下载并显示错误消息 failed network error。是不是我的响应码写错了?
【问题讨论】:
-
"下载成功,但文件没有下载" 这似乎是矛盾的。如果文件没有下载,那么如何下载成功?
-
也许这与您在同一响应中同时发送文件内容和 JSON 有效负载这一事实有关?
-
如果我的声明的意思没有被理解,我很抱歉,我的意思是下载消息显示成功但文件没有下载。
-
@RichardDeeming 我已经编辑了我的代码,希望你能理解。对不起,如果我的英语不好
-
正如我所说,您将在对
GenerateFile操作的响应中同时发送文件内容和 JSON blob。这会损坏文件。
标签: javascript jquery httpresponse asp.net5