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 相关文章推荐
JQuery小知识
Oct 15 Javascript
PHPMyAdmin导入时提示文件大小超出PHP限制的解决方法
Mar 30 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
Apr 06 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 Javascript
JS图片压缩(pc端和移动端都适用)
Jan 12 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
vue页面离开后执行函数的实例
Mar 13 Javascript
Vue2.0 事件的广播与接收(观察者模式)
Mar 14 Javascript
vue的diff算法知识点总结
Mar 29 Javascript
vue使用jsonp抓取qq音乐数据的方法
Jun 21 Javascript
完美解决通过IP地址访问VUE项目的问题
Jul 18 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 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
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
Laravel5中contracts详解
2015/03/02 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
javascript call方法使用说明
2010/01/11 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python实现12306火车票查询器
2017/04/20 Python
Python 查看文件的读写权限方法
2018/01/23 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
python读出当前时间精度到秒的代码
2019/07/05 Python
python字符串判断密码强弱
2020/03/18 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
妇女儿童发展规划实施方案
2014/03/16 职场文书
企业节能减排实施方案
2014/03/19 职场文书
节能宣传周活动总结
2014/05/08 职场文书
质量负责人任命书
2014/06/06 职场文书
志愿者宣传口号
2014/06/17 职场文书
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
python基础之模块的导入
2021/10/24 Python