我正在尝试通过Web API下载excel文件(使用Entity框架)。下载工作正常但我在尝试打开文件时收到有关文件损坏的错误对话框。
Web API代码如下:
public HttpResponseMessage GetValue(int ID, string name)
{
MemoryStream stream;
try {
using (DataContext db = new DataContext()) {
dynamic fileObj = (from c in db.FileList c.ID == IDc).ToList();
stream = new MemoryStream(fileObj(0).File);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue(fileObj(0).FileContentType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = name };
return result;
}
} catch (Exception ex) {
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
它打开文件,显示两个错误对话框并显示以下信息。
Excel完成了文件级验证和修复。本工作簿的某些部分可能已经修复或丢弃
答案 0 :(得分:1)
试图解决同样的问题。我比较了 2 个 epplus 版本:4.5.3.3 和 5.2.1。后一个包括用于关闭 GetAsByteArray 过程中的流的代码。所以,我只是将这些行添加到 4.5.3.3 版本中,它就像一个魅力。看起来流最初包含一些垃圾字节,必须在将文件数据泵入该流之前将其删除。 使用 NetCore 3.1 Web 应用程序进行测试。希望它能解决您的问题。
if (save)
{
Workbook.Save();
_package.Close();
/* start of added code */
if (_stream is MemoryStream && _stream.Length > 0)
{
CloseStream();
}
/* end of added code */
_package.Save(_stream);
}
答案 1 :(得分:0)
我遇到了同样的问题,问题不在Web api代码中,而是在客户端代码中。对我来说,我正在使用jQuery。以下代码为我修复了该问题。
我正在根据结果创建一个Blob,这不是必需的,因为result已经是一个Blob。
window.URL.createObjectURL(result);
请注意,我正在直接从结果中创建对象。完整的Jquery代码如下。
在here的信用额度中获得信用
$.ajax({
type: 'POST',
url: url + "/download",
data: data,
xhr: function () {
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob'
return xhr;
},
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 link = document.createElement('a');
link.href = window.URL.createObjectURL(result);
link.download = filename;
link.click();
}, error: function (a, b) {
console.log('Error');
}
});