У меня есть приложение ASP.NET MVC, которое на одной странице имеет кнопку, которая, когда пользователь нажимает кнопку в веб-браузере:
- браузер отправляет AJAX POST на сервер
- сервер создает ZIP-архив, используя MemoryStream , поэтому на сервере нет физического файла
- сервер возвращает ZIP-архив в теле ответа
- браузер получает тело ответа и создает объект BLOB, который загружается пользователем
До шага 3 все работает как положено. Я использовал Fiddler для перехвата ответа сервера, я вручную создал ZIP-файл с байтами из ответа, и все в порядке.
Когда пользователь загружает файл из веб-браузера, он поврежден. Я понял, что размер (длина) файла больше, чем длина тела ответа.
Вот код, который генерирует ответ от сервера
Response.AppendHeader("Content-Disposition", "attachment; filename=test.zip");
Response.AppendHeader("Content-Length", memoryStream.Length.ToString());
Response.AppendHeader("Content-Type", "application/zip; charset=utf-8");
Response.BinaryWrite(memoryStream.ToArray());
Response.End();
Вот код, который создает и загружает файл из ответа сервера
saveZipFile = (zipFile: any /* zipFile is the server's response */) => {
if (!('Blob' in window)) {
alert('Your browser does not support the HTML5 Blob.');
return;
}
var fileName = "test.zip";
var textFileAsBlob = new Blob([zipFile], { encoding: "UTF-8", type: "application/zip; charset=utf-8" } as any);
if ('msSaveOrOpenBlob' in navigator) {
navigator.msSaveOrOpenBlob(textFileAsBlob, fileName);
} else {
var downloadLink = document.createElement('a');
downloadLink.download = fileName;
downloadLink.innerHTML = 'Download File';
if ('webkitURL' in window) {
// Chrome allows the link to be clicked without actually adding it to the DOM.
downloadLink.href = (window as any).webkitURL.createObjectURL(textFileAsBlob);
} else {
// Firefox requires the link to be added to the DOM before it can be clicked.
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = (event: any) => {
document.body.removeChild(event.target);
};
downloadLink.style.display = 'none';
document.body.appendChild(downloadLink);
}
downloadLink.click();
}
}
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Что может быть не так?
PD: Я думаю, что это связано со строковым кодированием.