React/Redux 下载文件

2023-12-08

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

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

该操作是异步的,并执行 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 中,我期望下载的底部栏与我的文件一起出现)。

我究竟做错了什么?


根据内特的回答here,Ajax请求的响应不被浏览器识别为文件。对于所有 Ajax 响应,它的行为方式都是相同的。 您需要手动触发下载弹出窗口。

在我的实现中,我使用了文件保护程序js一旦我在reducer中收到API响应,就会触发下载弹出窗口。

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

请找到下面的减速器示例代码: (根据Redux,使用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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React/Redux 下载文件 的相关文章

随机推荐

  • 创建自定义 tomcat 会话管理器而不将 jar 放入 CATALINA_HOME 目录?

    我正在为 Tomcat 开发一个自定义会话管理器 并且我让它工作时有一个警告 我必须将 jar 以及所有相关的 jar 放在 CATALINA HOME lib 目录中 否则我会得到一个 noclassdef 发现异常 即使类位于 WEB
  • PHPExcel 创建“不可读的内容”

    我尝试了大约 1000 种不同的方法来解决这个问题 如果其他人能够发现问题 我们将不胜感激 我有使用 PHPExcel 的代码 可以生成多个 Excel 工作表并将它们保存到磁盘 使用 MS Excel 2010 打开第二个文件及以后的所有
  • Images.xcassets 为 iPhone 6 拍摄了错误的图像?

    我已经为 2x Retina 4 和 3x 设置了三个图像 当我运行该应用程序时 我得到以下结果 iPhone 4s 推特图像 iPhone 5 谷歌图片 iPhone 6 脸书图片 iPhone 6 推特图像 一切都很好 但是当我跑在iP
  • 使用 JMESPATH 获取对象上的 JSON 元素的查询

    当我有一个简单的 JSON 时 例如 name Tom age 20 是否有任何 JMESPath 查询可以获取age只有当name is Tom 查询应该得到20与上面的 JSON 一起 但是 如果名字不是Tom like name Bo
  • 为什么在平移和更改相机角度时我的有线球体会变成椭球体?

    我需要沿 z 轴来回平移有线球体 同时更改相机角度 每当我的球体被平移时 它就会慢慢变成椭球体 我实在不明白为什么 在这里您可以看到我认为有错误的代码片段 此外 调整窗口大小时不应更改形状 而只能更改其大小 void init glClea
  • Android 中的全文搜索示例

    我很难理解如何在 Android 上使用全文搜索 FTS 我读过有关 FTS3 和 FTS4 扩展的 SQLite 文档 而且我知道在Android上可以做到 然而 我很难找到任何我能理解的例子 基本数据库模型 一个 SQLite 数据库表
  • iPhone 亮度私有 API 无法正常工作

    我正在尝试设置背光的亮度 但它的表现非常奇怪 我正在使用私有 API id UIApplication共享应用 setBacklightLevel 1 0f 然而 当我调用此命令时 屏幕变暗 并没有像我想象的那样变得 100 亮 我用各种数
  • 匹配除电子邮件地址之外的所有内容的正则表达式

    假设这是输入 这是一个段落 这是一个段落 这是一个段落 这是一个段落 这是一个段落 这是一个段落 这是一个电子邮件地址 电子邮件受保护 我想要一个匹配除电子邮件地址之外的所有内容的正则表达式 我努力了 这会匹配除电子邮件所在的 LINE 之
  • 是否有缺少固定宽度类型 (intXX_t) 的平台?

    C 11 具有固定宽度 2 的补码类型 u int8 t u int16 t etc 然而 这些类型是可选的 有时我需要使用这些类型 因此我的代码可能不太可移植 有没有什么平台 提供 C 11 编译器 目前 哪些类型不存在 是否有任何 通用
  • Android 长按滚动

    我想将长按与滚动 连接 这样用户就不必释放屏幕并开始滚动 我已经实现了手势检测器 final GestureDetector gestureDetector new GestureDetector new GestureDetector S
  • 未找到 Apple-app-site-association

    我正在尝试通过Apple 搜索验证工具 并且我在使用 apple app site association 时遇到问题 由于某种原因 机器人找不到我的文件 但如果你打开 URL 它就在那里 这不是格式问题 因为甚至找不到该文件 我有 htt
  • 将 JSON 驼峰式大小写转换为蛇形大小写(反之亦然)并将数值字符串化

    我必须向 Web REST 服务发送和接收 JSON 对象 这些对象由 DLL 生成 该 DLL 将属性名称序列化为大驼峰式命名法 PropertyName 而 Web 服务需要蛇形命名法 property name 另外 DLL 将数值序
  • GMaps JS 地理编码:通过异步地理编码功能使用/传递变量?

    我有一个位置对象的数组列表 我正在使用其中一些来构建完整的地址 然后对其进行地理编码 一旦我收到 OK 状态 我就会在地图上放置一个标记 这一切都很好 但是 现在我还想在每个标记上放置一个信息窗口 其中包含数组列表中的另一个属性 Locat
  • iPhone:向滚动视图添加按钮使按钮无法交互

    由于某种原因 在我的 viewController 的 addBook 方法中初始化的按钮不会响应触摸 我分配给它的选择器永远不会触发 点击图像时也不会出现 UIControlStateHighlighted 图像 在触摸到达 UIButt
  • 检查函数是否被作为 goroutine 调用

    有什么办法可以知道正在运行的函数是否被调用为 goroutine 吗 我读过 gotour 并且对使用 golang 构建 websocket 服务器感兴趣 所以我找到了这个教程https tutorialedge net golang g
  • 在 ASP.NET MVC 中以编程方式验证模型列表

    我想以编程方式一一验证模型列表 I tried 尝试验证模型但看起来它聚合了验证错误 因此当我迭代 10 个模型的列表时 如果第 5 个模型无效 则对于模型 6 10 TryValidateModel 返回false 您可以使用控制器方法V
  • 修改编辑距离以实现位置偏差

    我使用 Levenshtein 距离算法将作为用户输入提供的公司名称与已知公司名称的数据库进行比较 以找到最接近的匹配 就其本身而言 该算法工作正常 但我想构建一个偏差 以便如果字符串的初始部分匹配 则编辑距离被认为较低 例如 如果搜索条件
  • Haskell 中的类型比较

    我还在学习 Haskell 的基础知识 我试图找到这个简单问题的答案 所以我提前道歉 因为我确信它很简单 Given data Fruit Fruit Apple Orange deriving Show Eq a Apple 如何检查某个
  • 按百分比设置位置 - Android DisplayMetrics

    我喜欢对应用程序中的所有位置使用百分比 我总是使用相同的系统 我是android编程新手 这是班级 public class SCREEN DisplayMetrics dm new DisplayMetrics Point size ne
  • React/Redux 下载文件

    单击按钮时我需要从服务器下载文件 我创建了一个 MaterialUI 按钮 并在其 onclick 回调上调用容器组件的操作连接的 该操作是异步的 并执行 ajax POST export const onXlsxClick gt disp