Хотите скачать почтовый файл, который возвращается как FileStreamResult - PullRequest
0 голосов
/ 18 октября 2019

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

[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<string>("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) => {
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 => {
        console.log(res);
        console.log(res.data);
        let fileName = `${this.state['selectedCommunity']}`
        const arrayBuffer = base64ToArrayBuffer(res.data);
        createAndDownloadBlobFile(arrayBuffer, fileName, 'zip');
    })
    .catch(error => {
        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) => binaryString.charCodeAt(i));
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...