JavaScript — хотите загрузить ZIP-файл, который возвращается как FileStreamResult

Хотите скачать почтовый файл, который возвращается как FileStreamResult

У меня есть Web Api, который возвращает FileStreamResult, я хочу скачать файл в формате zip, я мог бы скачать, если Web Api возвращает необработанный байтовый массив, но по какой-то причине руководство хотело его только из FileStreamResult, может кто-нибудь пожалуйста помогите мне, как я могу записать в файл, используя FileStreamResult — спасибо. Я помещаю код здесь, метод Web Api, который возвращается как FileStreamResult, но клиентский код функций javascript и реагирующих событий, которые я помещаю, работает, но с массивом байтов, так что кто-то может подсказать мне, какие изменения я могу внести в клиентский скрипт для работы и загрузки zip-файла. Мне нужна помощь, пожалуйста — спасибо. Ниже мой код веб-API:

 [EnableCors("AnotherPolicy")] [HttpPost] public FileStreamResult Post([FromForm] string communityName, [FromForm] string files) //byte[] { var removedInvalidCharsFromFileName = removeInvalidCharsFromFileName(files); var tFiles = removedInvalidCharsFromFileName.Split(','); string rootPath = Configuration.GetValue{amp}lt;string{amp}gt;("ROOT_PATH"); string communityPath = rootPath   "\"   communityName; byte[] theZipFile = null; FileStreamResult result = null; using (MemoryStream zipStream = new MemoryStream()) { using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true)) { foreach (string attachment in tFiles) { var zipEntry = zip.CreateEntry(attachment); using (FileStream fileStream = new FileStream(communityPath   "\"   attachment, FileMode.Open)) using (Stream entryStream = zipEntry.Open()) { fileStream.CopyTo(entryStream); } } } theZipFile = zipStream.ToArray(); result = new FileStreamResult(zipStream, "application/zip") { FileDownloadName = $"{communityName}.zip" }; } //return theZipFile; return result; } 

Вот мое событие React для скачивания

 handleDownload = (e) ={amp}gt; { e.preventDefault(); var formData = new FormData(); formData.append('communityname', this.state.selectedCommunity); formData.append('files', JSON.stringify(this.state['checkedFiles'])); //let env='local'; let url = clientConfiguration['filesApi.local']; //let tempFiles = clientConfiguration[`tempFiles.${env}`]; //alert(tempFiles); axios({ method: 'post', responseType: 'application/blob', contentType: 'application/blob', url: url, data: formData }) .then(res ={amp}gt; { console.log(res); console.log(res.data); let fileName = `${this.state['selectedCommunity']}` const arrayBuffer = base64ToArrayBuffer(res.data); createAndDownloadBlobFile(arrayBuffer, fileName, 'zip'); }) .catch(error ={amp}gt; { console.log(error.message); }); }; 

Вот общие функции, которые я написал в файле CommonFuncs.js:

 export function createAndDownloadBlobFile(body, filename, extension = 'pdf') { const blob = new Blob([body]); const fileName = `${filename}.${extension}`; if (navigator.msSaveBlob) { // IE 10  navigator.msSaveBlob(blob, fileName); } else { const link = document.createElement('a'); // Browsers that support HTML5 download attribute if (link.download !== undefined) { const url = URL.createObjectURL(blob); link.setAttribute('href', url); link.setAttribute('download', fileName); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } } } export function base64ToArrayBuffer(base64) { const binaryString = window.atob(base64); // Comment this if not using base64 const bytes = new Uint8Array(binaryString.length); return bytes.map((byte, i) ={amp}gt; binaryString.charCodeAt(i)); } 

Любая помощь будет очень полезна, пожалуйста, спасибо заранее

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector