Всем добрый день!
На сервере создаю зип архив из множества файлов и пытаюсь его скачать на клиент. Но 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.
Response такого вида: