Ant Design Pro 下实现文件下载的实现代码


Posted in Javascript onDecember 03, 2019

最近编写在页面内通过 AJAX 请求服务器下载文件遇到一些问题,网上找的资料和介绍大多不健全不系统,最终自己摸索出来的解决方案,先简单写个初稿,后面再详细补充。

表一:前端请求后端下载文件的各种情况

请求方法 请求方式 响应结果
GET 页面跳转 文件对应的 URL
POST AJAX 文件的二进制流

首先,需要在 src/service/api.js 里声明对应请求返回的文件类型:

import request from '@/utils/request';

export async function Download(params = {}) {
 return request(`/api/download`, {
  method: 'POST', // GET / POST 均可以
  data: params,
  responseType : 'blob', // 必须注明返回二进制流
 });
}

然后在对应的 Model 里编写相关请求处理的业务逻辑:

import { message } from 'antd';
import { Download } from '@/services/api';

export default {
  namespace: 'download',
  
  state: {},
  
  effects: {
    *download({ payload, callback }, { call }){
      const response = yield call(Download, payload);
      if (response instanceof Blob) {
        if (callback && typeof callback === 'function') {
           callback(response);
        }
      } else {
        message.warning('Some error messages...', 5);
      }
    }
  },
  
  reducers: {},
}

最后编写页面组件相关业务逻辑,点击下载按钮,派发下载 action 到 model :

import React, { Component } from 'react';
import { Button } from 'antd';
import { connect } from 'dva';

@connect(({ download, loading }) => ({
 download,
 loading: loading.effects['download/download'],
}))
class ExampleDownloadPage extends Component {
  handleDownloadClick = e => {
    e.preventDefault();
    const { dispatch } = this.props;
    const fileName = 'demo.xlsx';
    
    dispatch({
      type: 'download/download',
      payload: {}, // 根据实际情况填写参数
      callback: blob => {
        if (window.navigator.msSaveOrOpenBlob) {
          navigator.msSaveBlob(blob, fileName);
        } else {
          const link = document.createElement('a');
          const evt = document.createEvent('MouseEvents');
          link.style.display = 'none';
          link.href = window.URL.createObjectURL(blob);
          link.download = fileName;
          document.body.appendChild(link); // 此写法兼容可火狐浏览器
          evt.initEvent('click', false, false);
          link.dispatchEvent(evt);
          document.body.removeChild(link);
        }
      }
    });
  }
  
  render(){
    const { loading } = this.props;
    
    return <Button 
          loading={loading} 
          icon="download" 
          onClick={this.handleDownloadClick}
        >
         下载
        </Button>;
  }
}

大功告成!~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个小型js框架myJSFrame附API使用帮助
Jun 28 Javascript
一个JavaScript变量声明的知识点
Oct 28 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
javascript实现回车键提交表单方法总结
Jan 10 Javascript
AspNet中使用JQuery boxy插件的确认框
May 20 Javascript
js实现固定显示区域内自动缩放图片的方法
Jul 18 Javascript
学习Javascript面向对象编程之封装
Feb 23 Javascript
vue.js组件之间传递数据的方法
Jul 10 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 jQuery
微信小程序下拉框搜索功能的实现方法
Jul 31 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
Vue.js 无限滚动列表性能优化方案
Dec 02 #Javascript
浅谈关于vue中scss公用的解决方案
Dec 02 #Javascript
详解js location.href和window.open的几种用法和区别
Dec 02 #Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 #Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 #Javascript
VUE 动态组件的应用案例分析
Dec 02 #Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
Dec 02 #Javascript
You might like
2021年最新CPU天梯图
2021/03/04 数码科技
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
ThinkPHP里用U方法调用js文件实例
2015/06/18 PHP
Yii清理缓存的方法
2016/01/06 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
广告显示判断
2006/08/31 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
js实现延迟加载的几种方法详解
2019/01/19 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
Python在不同目录下导入模块的实现方法
2017/10/27 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
解决Matplotlib图表不能在Pycharm中显示的问题
2018/05/24 Python
python 将md5转为16字节的方法
2018/05/29 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
党员一句话承诺大全
2014/03/28 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
八一建军节慰问信
2015/02/14 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang