Как скачать fetch response в react как файл
здесь код actions.js
export function exportRecordToExcel(record) {
return ({fetch}) => ({
type: EXPORT_RECORD_TO_EXCEL,
payload: {
promise: fetch('/records/export', {
credentials: 'same-origin',
method: 'post',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
}).then(function(response) {
return response;
})
}
});
}
возвращенный ответ . Я хочу, чтобы пользователь мог сохранить его как файл, но ничего не происходит. Я предполагаю, что сервер возвращает правильный тип ответа, потому что в консоли он говорит
Content-Disposition:attachment; filename="report.xlsx"
что я упустил? Что мне делать в редукторе?
2 ответов
технология браузера в настоящее время не поддерживает загрузку файла непосредственно из Ajax-запроса. Работа вокруг состоит в том, чтобы добавить скрытую форму и отправить ее за кулисы, чтобы браузер запустил диалог сохранения.
я запускаю стандартную реализацию потока, поэтому я не уверен, каким должен быть точный код Redux (Reducer), но рабочий процесс, который я только что создал для загрузки файла, выглядит так...
- у меня есть компонент React под названием
FileDownload
. Все этот компонент делает рендеринг скрытой формы, а затем внутриcomponentDidMount
, немедленно отправьте форму и называем этоonDownloadComplete
проп. - у меня есть еще один компонент React, мы назовем его
Widget
, с кнопкой загрузки / значком (многие на самом деле... по одному для каждого элемента таблицы).Widget
имеет соответствующие действия и хранить файлы.Widget
импортFileDownload
. -
Widget
есть два метода, связанные с Скачать:handleDownload
иhandleDownloadComplete
. -
Widget
магазин свойствоdownloadPath
. Он установлен вnull
по умолчанию. Когда его значение установлено вnull
, нет загрузки файла в процессе иWidget
компонент не оказывает
вы можете использовать эти две библиотеки для загрузки файлов http://danml.com/download.html https://github.com/eligrey/FileSaver.js/#filesaverjs
пример
// for FileSaver
import FileSaver from 'file-saver';
export function exportRecordToExcel(record) {
return ({fetch}) => ({
type: EXPORT_RECORD_TO_EXCEL,
payload: {
promise: fetch('/records/export', {
credentials: 'same-origin',
method: 'post',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
}).then(function(response) {
return response.blob();
}).then(function(blob) {
FileSaver.saveAs(blob, 'nameFile.zip');
})
}
});
// for download
let download = require('./download.min');
export function exportRecordToExcel(record) {
return ({fetch}) => ({
type: EXPORT_RECORD_TO_EXCEL,
payload: {
promise: fetch('/records/export', {
credentials: 'same-origin',
method: 'post',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
}).then(function(response) {
return response.blob();
}).then(function(blob) {
download (blob);
})
}
});