【发布时间】:2021-02-12 02:21:36
【问题描述】:
我有一个 C# 后端在内存中生成一个 zip 文件(使用 System.IO.Compression)并将其发送到我的前端。如果我在发送之前下载 zip 文件,它运行良好并且采用 ANSI 编码(在 notepad++ 上找到)。
这就是我目前返回文件的方式,我尝试了许多不同的方法来做到这一点,例如简单地返回一个没有标题的文件,但现在它看起来像这样:
[HttpPost]
[Route("GetUserWorkContext")]
public async Task<IActionResult> GetUserWorkContext([FromBody] GetUserWorkContextRequest request, [FromServices] IExportManager exportManager)
{
var zipStream = await exportManager.GetUserWorkContext(userId, request.IncludeArchived);
HttpContext.Response.Headers.Add("Content-Disposition", "attachment; filename = test.zip; charset=Windows-1252");
HttpContext.Response.Headers.Add("Content-Length", zipStream.ToArray().Length.ToString());
return File(zipStream.ToArray(), "application/octet-stream");
}
似乎无论我如何使用Javascript(前端)下载文件,它都以utf8编码保存(再次使用notepad ++找到)。我尝试使用 js-file-download (https://www.npmjs.com/package/js-file-download) 或创建 blob,但我最终下载的任何内容都以 utf8 编码。
我应该如何在不损坏存档的情况下以 Javascript 下载此文件?
这是我目前在 Javascript 中的尝试,使用我在此处找到的一段代码 (JavaScript blob filename without link) 下载文件:
function getUserWorkContext({ includeArchived }) {
return new Promise(function () {
Axios.post('/api/Export/GetUserWorkContext', {includeArchived})
.then((response) => {
if(response.data){
var blobObject = new Blob([response.data], {type: 'application/zip;charset=Windows-1252'});
downloadFile(blobObject, "test.zip");
}
})
}
function downloadFile(file, fileName) {
if (navigator.msSaveBlob) { // For ie and Edge
return navigator.msSaveBlob(file, fileName);
}
else {
let link = document.createElement('a');
link.href = window.URL.createObjectURL(file);
link.download = fileName;
document.body.appendChild(link);
link.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
link.remove();
window.URL.revokeObjectURL(link.href);
}
}
注意:实际 zip 为 3,747KB,而从 Javascript 下载的 zip 总是大得多,在这种情况下:6,917KB。
【问题讨论】:
-
您是否尝试删除标头 Content-Disposition 和 Content-Length?它们对我来说似乎是多余的......
-
@nikneem 是的,我有,我尝试返回 return File(zipStream.ToArray(), "application/octet-stream");并返回 File(zipStream.ToArray(), "application/octet-stream", "test.zip");没有设置标题,这两个都不起作用
-
我相信,你不需要转换你的
zipStream.ToArray()。它适用于流File(zipStream, "application/octet-stream", "test.zip"); -
好主意@Tolbxela,但它似乎并没有改变结果。
-
@barbo 请检查我的更新答案。
标签: javascript c# encoding axios zip