@kaffetk_a

Как скачать файл с сервера?

Всем добрый день!
На сервере создаю зип архив из множества файлов и пытаюсь его скачать на клиент. Но zip выходит битым.
Если качаю этот зип на сервер, то зип нормально открывается.
в JS блоб создается размером больше, чем Content-Length в Response.
Код на стороне сервера
[HttpGet]
        [AllowCrossSiteJson]
        public ActionResult DownloadDocumentList()
        {
            try
            {
                var result = _fileUploaderWorker.GetDocumentList(accountNumber);
                var docs = JsonConvert.DeserializeObject<DocumentsInfos>(result);
                using (var zipMs = new MemoryStream())
                {
                    using (var zip = new ZipArchive(zipMs, ZipArchiveMode.Create, true))
                    {
                        using (var webClient = new WebClient())
                        {
                            foreach (var doc in docs.documents)
                            {
                                var data = webClient.DownloadData(doc.DocUrl);
                                var content = new MemoryStream(data);
                                var entry = zip.CreateEntry(doc.FileName);
                                using (var entryStream = entry.Open())
                                {
                                    content.CopyTo(entryStream);
                                }
                            }
                        }
                    }
                    using (var fileStream = new FileStream(@"C:\Users\user\Downloads\test.zip", FileMode.Create))
                    {
                        zipMs.Seek(0, SeekOrigin.Begin);
                        zipMs.CopyTo(fileStream);

                        long FileSize = zipMs.Length;
                        zipMs.Position = 0;
                        byte[] Buffer = new byte[(int)FileSize];
                        zipMs.Read(Buffer, 0, (int)FileSize);

                        Response.Clear();
                        Response.AddHeader("Content-Disposition", "attachment; filename=\"files.zip\"");
                        Response.AddHeader("Content-Description","File Transfer");
                        Response.AddHeader("Content-Type","application/zip");
                        Response.AddHeader("Content-Transfer-Encoding","binary");
                        Response.AddHeader("Expires","0");
                        Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
                        Response.AddHeader("Pragma","public");
                        return File(Buffer, "application/zip");
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
            }
        }

кусок JS
var xhr = new XMLHttpRequest();
				xhr.open('GET', that.downloadDocumentListUrl, false);
				xhr.send();
				if (xhr.status != 200) {
					alert(xhr.status + ': ' + xhr.statusText);
				} else {
					var blob = new Blob([xhr.responseText], { type: 'application/zip' });
					var URL = window.URL || window.webkitURL;
					var downloadUrl = URL.createObjectURL(blob);
					var filename = "files.zip";
					if (filename) {
						var a = document.createElement("a");
						if (typeof a.download === 'undefined') {
							window.location.href = downloadUrl;
						} else {
							a.href = downloadUrl;
							a.download = filename;
							document.body.appendChild(a);
							a.click();
						}
						setTimeout(function () { URL.revokeObjectURL(downloadUrl); }, 150000);
					} else {
						window.location.href = downloadUrl;
					}
				}


Может кто подскажет что делать с этим zip архивом? Может кодировка не та или еще что-то?
на сервере сохраняется zip размером 1271 КБ
на клиенте 2319КБ.

На сервере сохраняется для теста, поэтому скачать с него напрямую не представляется возможным.
jQuery старый, версии 1.x.x.

nsSD1yj
Response такого вида:
DzB6pb9
  • Вопрос задан
  • 807 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
Конкретно здесь проблема в том, что ты скачиваешь бинарный файл в строку, а потом эту строку упаковываешь в блоб (при этом, несмотря на type: 'application/zip', конструктор Blob кодирует строку как utf8). XMLHttpRequest и fetch позволяют сразу получить данные как блоб.

конкретно здесь лучше не "выпендриваться", а просто воткнуть that.downloadDocumentListUrl в window.location.href или a.href, напрямую, без этих твоих xhr, createObjectURL и т.д.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы