【发布时间】:2019-07-23 20:13:10
【问题描述】:
我有一个将数据表转换为 excel 字节并将其作为文件发送的 web api。当我尝试打开 excel 文件时,我收到“我们发现 'Test.xlsx' 中的某些内容存在问题。您希望我们尽可能恢复吗?如果您信任此工作簿的来源,请单击是的。”。当我单击是时,我得到“文件已损坏,无法打开”。
我已经尝试过以下堆栈溢出问题中提到的解决方案:
ASP.NET MVC FileResult is corrupting files
Excel file (.xlsx) created by saving byte stream in C# cannot be opened
issue with returning HttpResponseMessage as excel file in WebAPI
'The file is corrupt and cannot be opened' OpenXML
[HttpPost]
public FileResult GetExcelFile(string parameters)
{
byte[] contents = generateContents(parameters);
// Method 1:
//Response.Clear();
// Response.ContentType = "application/octet-stream";
// Response.AddHeader("Content-Disposition", "attachment; filename=" + "Test.xlsx");
// Response.AddHeader("Content-Length", contents.Length.ToString());
// Response.BinaryWrite(contents);
// Response.Flush();
// Response.Close();
// Response.End();
return File(contents, "application/octet-stream", "Test.xlsx");
}
$.ajax({
url: webMethod,
type: "POST",
data: jQuery.param(parameters),
success: function (result, status, xhr) {
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) {
filename = matches[1].replace(/['"]/g, '');
}
}
var blob = new Blob([result]);
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
link.click();
}
});
提前感谢您的帮助!
更新:
从控制器返回的文件大小为 4 KB,而在 ajax 端,接收到的 blob 大小为 7 KB。
【问题讨论】:
-
这可能不是客户端的问题,可能是您生成文档的方式。你能先验证一下吗?也许不是调用 generateContents 调用,您可以读取任何有效的 excel 文件并查看。
-
@KrishnaChaithanyaMuthyala:与有效的 excel 文件相同的错误。有什么建议吗?
-
好的...所以问题似乎出在客户端然后...首先,为什么这是一个 POST,如果它只是获取数据?那么为什么你在返回时没有使用正确的 mime-type,正如你给出的第一个链接中提到的那样?
-
你的平台是什么?带有剃刀视图的 ASP.NET MVC 和 webAPI?您是否希望在单击按钮或其他内容时下载此文件?
-
我将其更改为 HttpGet 并尝试使用
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet和application/vnd.ms-excel。 stackoverflow.com/questions/44559457/…stackoverflow.com/questions/51150454/…同样的回复