У меня есть angular машинописное веб-приложение, которое принимает некоторые пользовательские данные. Входные данные отправляются в приложение do tnet core web api для обработки. В результате обработки создается zip-файл, который оборачивает папку с файлами. Мне нужно скачать этот zip-файл как ответ на тот же вызов API.
Мой код контроллера
[HttpPost]
public async Task<ActionResult> PostAsync(MyInput input)
{
// code to process input, generate folder with files, and zip the folder
// zipPath is the full path to the zip file
// fileName is the file name of the zipPath
const string contentType = "application/zip";
FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes(zipPath), contentType)
{
FileDownloadName = fileName,
};
return Ok(result);
}
Мой машинописный код находится здесь:
import {downloadFile} from "file-saver";
const httpOptions = {headers: new HttpHeaders({"Content-Type": "application/json"})};
...
download(input: MyInput): Observable<Blob>
{
return this.http.post<Blob>(url, input, httpOptions);
}
myFunction(input: MyInput)
{
this.download(input)
.subscribe(data => {
var a: any = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
var blob = new Blob([data], { type: 'application/zip' });
var url= window.URL.createObjectURL(blob);
a.href = url;
a.download = "test.zip";
a.click();
window.URL.revokeObjectURL(url);
});
},
error => {
console.log("Something went wrong");
});
}
Когда Я отлаживаю в данных внутри подписки, fileDownloadName имеет zip-имя файла из веб-API, а contentType это application / zip. Однако fileContents содержит массив, который длиннее, чем размер сжатых байтов из веб-API. Почему размер отличается от его размера в архиве со стороны API?
Код сохранил сжатый файл на клиентском компьютере, однако, когда я пытаюсь открыть его, он показывает «Ошибка сжатых (сжатых) папок» "с сообщением" Сжатая (заархивированная) папка 'C: \ Users {имя пользователя} \ Downloads \ test.zip' недействительна. " Почему?
В строке "a.download =" test.zip "; я жестко закодировал имя файла размера клиента. Как мне получить доступ к data.fileDownloadName (возвращающемуся из веб-API) для инициализации имени файла «Я могу видеть значение, но не знаю, как использовать его в скрипте типа. Я новичок в этом.
Заранее спасибо за помощь.
Рой