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 相关文章推荐
有一段有意思的代码-javascript现实多行信息
Aug 26 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
Vue.js每天必学之数据双向绑定
Sep 05 Javascript
利用jquery获取select下拉框的值
Nov 23 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
Jan 13 Javascript
解析Vue.js中的组件
Feb 02 Javascript
100行代码实现一个vue分页组功能
Nov 06 Javascript
JS实现密码框效果
Sep 10 Javascript
小程序自定义圆形进度条
Nov 17 Javascript
vue3获取当前路由地址
Feb 18 Vue.js
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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP 8新特性简介
2020/08/18 PHP
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
Ajax基础知识详解
2017/02/17 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
python进度条显示之tqmd模块
2020/08/22 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
俄罗斯马克西多姆家居用品网上商店:Максидом
2020/02/06 全球购物
室内设计专业毕业生求职信
2014/05/02 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
销售员自我评价
2015/03/11 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server