Несоответствие между размером ответа сервера и размером объекта BLOB-объекта клиента - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть приложение ASP.NET MVC, которое на одной странице имеет кнопку, которая, когда пользователь нажимает кнопку в веб-браузере:

  1. браузер отправляет AJAX POST на сервер
  2. сервер создает ZIP-архив, используя MemoryStream , поэтому на сервере нет физического файла
  3. сервер возвращает ZIP-архив в теле ответа
  4. браузер получает тело ответа и создает объект 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: Я думаю, что это связано со строковым кодированием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...