在我的MVC应用程序中,我已为所有响应启用了gzip压缩。如果您正在使用具有gzipped响应的ajax调用读取此二进制写入,则会获取gzipped字节数组,而不是您需要处理的原始字节数组。
[compress]
public ActionResult Print(int id)
{
...
var byteArray=someService.BuildPdf(id);
return return this.PDF(byteArray, "test.pdf");
}
public class PDFResult : ActionResult
{
...
public override void ExecuteResult(ControllerContext context)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", string.Concat("attachment; filename=", fileName));
HttpContext.Current.Response.AddHeader("Content-Length", pdfBytes.Length.ToString());
HttpContext.Current.Response.BinaryWrite(byteArray);
HttpContext.Current.Response.End();
}
}
function pdf(mySearchObject) {
return $http({
method: 'Post',
url: '/api/print/',
data: mySearchObject,
responseType: 'arraybuffer',
headers: {
'Accept': 'application/pdf',
}
}).then(function (response) {
var type = response.headers('Content-Type');
var blob = new Blob([response.data], { type: type });
var fileName = response.headers('content-disposition').split('=').pop();
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, fileName);
} else {
var anchor = angular.element('<a/>');
anchor.css({ display: 'none' });
angular.element(document.body).append(anchor);
anchor.attr({
href: URL.createObjectURL(blob),
target: '_blank',
download: fileName
})[0].click();
anchor.remove();
}
});
}
"var blob = new Blob([response.data], { type: type });" 这段代码会在将字节数组转换为JavaScript中的文件时产生无效/损坏的文件,如果您不先解压缩它。
为了解决这个问题,您可以选择防止对二进制数据进行gzip压缩,以便您可以正确地将其转换为正在下载的文件,或者您必须在JavaScript代码中解压缩该gzip数据,然后再将其转换为文件。
context.Response.AddHeader("Content-disposition", "attachment; filename=\"" + {0} + "\"");
这将用引号括起文件名。以下是参考链接:什么是“重复头文件”警告? - fujiiface