В моем проекте MVC у меня есть вызов AJAX к веб-API.
Я отправляю массив маршрутов документов, API (должен) сжимает их и возвращает ZIP-файл.
self.zipDocs = function (docs, callback) {
$.ajax({
url: "../SharedAPI/documents/zip",
type: "POST",
data: docs,
contentType: "application/json",
success: function (data) {
var zip = new JSZip(data);
var content = zip.generate({ type: "blob" });
saveAs(content, "example.zip");
},
error: function (data) {
callback(data);
}
});
}
И моя функция ZipDocs в WebAPI (с использованием библиотеки DotNetZip):
[HttpPost]
[Route("documents/zip")]
public HttpResponseMessage ZipDocs([FromBody] string[] docs)
{
using (var zipFile = new ZipFile())
{
zipFile.AddFiles(docs, false, "");
return ZipContentResult(zipFile);
}
}
protected HttpResponseMessage ZipContentResult(ZipFile zipFile)
{
// inspired from http://stackoverflow.com/a/16171977/92756
var pushStreamContent = new PushStreamContent((stream, content, context) =>
{
zipFile.Save(stream);
stream.Close(); // After save we close the stream to signal that we are done writing.
}, "application/zip");
return new HttpResponseMessage(HttpStatusCode.OK) { Content = pushStreamContent };
}
Но когда Zip возвращается, я получаю следующую ошибку:
Uncaught Error: Corrupted zip: отсутствует 16053 байта.
Что действительно странно, когда я сохраняю в API zip-файл на диск, он сохраняется правильно, и я могу без проблем открыть файл!
Что я делаю неправильно? я что-то пропустил? Пожалуйста помоги!
Заранее спасибо.
using
дляzipFile
ваш объект быть удаленным до того, как данные будут полностью сохранены в потоке. Попробуйте удалить оператор using и посмотрите, работает ли он. Ваш код сохранения не будет запущен до тех пор, пока ваш объект не вернется. - person TyCobb   schedule 12.05.2016