我有一个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的一个问题:
我想,您应该使用blob
或arraybuffer
作为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-Disposition
和Content-Length
标头中没有必要。它们将自动生成。