gpt4 book ai didi

ajax - React/Redux 下载文件

转载 作者:行者123 更新时间:2023-12-05 08:56:28 24 4
gpt4 key购买 nike

我需要在单击按钮时从服务器下载文件。

我创建了一个 MaterialUI 按钮,并在其 onclick 回调中调用容器组件的操作 connected

该操作是异步的并执行 ajax POST:

export const onXlsxClick = () => dispatch => {
const urlParams = {
filters: {
aggregation: 'macro_area',
chart_resolution: '1_hour',
chart_from: '1478080363',
chart_to: '1477993963'
},
labels: ['PROVA1', 'PROVA2'],
series: [
{
label: null,
timestamp: 1478080363,
values: [123, 345]
},
{
label: null,
timestamp: 1477993963,
values: [153, 3435]
}
]
};
return $.ajax({
url:'/rest/export/chart/xlsx',
type: 'POST',
dataType: 'application/json',
contentType: 'application/json',
data: JSON.stringify(urlParams)
})
.done(data => {
console.log('success');
})
.fail(error => {
console.log(error);
});
};

服务器接收请求并通过此 REST 服务正确处理:

@POST
@Path("xlsx")
@Produces("application/vnd.ms-excel")
public Response getXlsx(ChartExportRequest request) {
ResponseBuilder responseBuilder;
ChartExportRequestDTO reqDto = null;
try {
reqDto = parseDTO(request);
checkRequestDTO(reqDto);
ExportDTO dto = getXlsxProvider().create(reqDto);

responseBuilder = Response.ok(dto.getFile())
.header("Content-disposition", "attachment;filename=" + dto.getFileName());
}
catch(Exception e) {
logger.error("Error providing export xlsx for tab RIGEDI with request [" + (reqDto != null ? reqDto.toString() : null) + "]", e);
responseBuilder = Response.serverError().entity(e.getMessage());
}
return responseBuilder.build();
}

问题是响应正确到达客户端,但随后什么也没有发生:我希望浏览器显示下载对话框(例如:在 chrome 中,我希望底部的下载栏与我的文件一起出现)。

我做错了什么?

最佳答案

根据 Nate 的回答 here ,浏览器无法将 Ajax 请求的响应识别为文件。对于所有 Ajax 响应,它将以相同的方式运行。您需要手动触发下载弹出窗口。

在我的实现中,我使用了 filesaverjs一旦我在 reducer 中收到 API 响应,就会触发下载弹出窗口。

由于 FileSaver 使用 blob 来保存文件,我将服务器的响应作为 blob 发送,将其转换为字符串数组缓冲区,然后使用它来保存我的文件。这种方法在

请在下面找到 reducer 的示例代码:(根据 Redux,使用 reducer 进行状态修改)reducer.js

let fileSaver = require("file-saver");


export default function projectReducer(state = {}, action)
{
let project;
switch (action.type) {
case GET_PROJECT_SUCCESS :
project = Object.assign(action.response.data);
return project;
case EXPORT_AND_DOWNLOAD_DATA_SUCCESS :
let data = s2ab(action.response.data);
fileSaver.saveAs(new Blob([data], {type: "application/octet-stream"}), "test.xlsx");
return state;


}
return state;

}

function s2ab(s) {
var buf = new ArrayBuffer(s.length);
var view = new Uint8Array(buf);
for (var i = 0; i != s.length; ++i) {
view[i] = s.charCodeAt(i) & 0xFF;
}
return buf;
}

关于ajax - React/Redux 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40377541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com