在前端下载ANSI zip文件,由C#后端生成



我有一个C#后端在内存中生成一个zip文件(使用System.IO.Compression(并将其发送到我的前端。如果我在发送zip文件之前下载了它,那么它运行良好,并且是ANSI编码的(可以在记事本++上找到(。

这就是我目前返回文件的方式,我尝试了很多不同的方法,比如简单地返回一个没有标题的文件,但现在看起来是这样的:

[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文件下载(https://www.npmjs.com/package/js-file-download(或创建Blob,但我最终下载的任何东西都是用utf8编码的。

我应该如何在不损坏档案的情况下用Javascript下载这个文件?

这是我目前在Javascript中的尝试,使用我在这里找到的一段代码(没有链接的Javascript blob文件名(下载文件:

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是3747KB,因为从Javascript下载的zip总是大得多,在本例中是6917kB。

这是axios的一个问题:

我想,您应该使用blobarraybuffer作为axios的responseType

{ responseType: 'blob' }

//responseType表示服务器将响应//选项为:"arraybuffer"、"document"、"json","text","stream"//仅限浏览器:"blob">

responseType: 'json'//默认

检查此答案:https://stackoverflow.com/a/60461828/2487565

===8<===================以前的版本===========================8<==

您的Content-Disposition标头错误。Content-Disposition标头没有charset参数。

查看文档:MDN HTTP内容处置

这就是为什么您的文件仍然以UTF-8发送,因为charset参数没有任何作用。

要使用UTF-8:

删除C#中的Content-headers和JavaScript中的charset参数

var blobObject = new Blob([response.data], {type: 'application/zip'});

如果您确实需要使用Windows-1252,可以尝试使用content-type参数进行设置。

return File(zipStream.ToArray(), "application/octet-stream;charset=Windows-1252");

另请检查:ASP.NET响应中的字符集编码

顺便说一下,UTF-8是首选的字符集编码:W3QA选择编码

而且,是的@nikeem,在Content-DispositionContent-Length标头中没有必要。它们将自动生成。

最新更新