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的IE和Firefox(火狐)兼容性的问题总结及常用例子
May 21 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
JS常用正则表达式总结
Nov 12 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
Aug 19 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
Dec 31 Javascript
非常实用的vue导航钩子
Mar 20 Javascript
JavaScript变量作用域_动力节点Java学院整理
Jun 27 Javascript
React Native中Navigator的使用方法示例
Oct 13 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 Javascript
怎么使用javascript深度拷贝一个数组
Jun 06 Javascript
用Angular实现一个扫雷的游戏示例
May 15 Javascript
vue props 一次传多个值实例
Jul 22 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
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
php通过session防url攻击方法
2014/12/10 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
用javascript实现给图片加链接
2007/08/15 Javascript
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
JavaScript 动态生成方法的例子
2009/07/22 Javascript
关于JavaScript的with 语句的使用方法
2011/05/09 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
JavaScript中的操作符类型转换示例总结
2016/05/30 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
python3下实现搜狗AI API的代码示例
2018/04/10 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
导致python中import错误的原因是什么
2020/07/01 Python
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
房地产开盘策划方案
2014/02/10 职场文书
小组名称和口号
2014/06/09 职场文书
公司2015年终工作总结
2015/05/26 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书