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 相关文章推荐
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
Jul 14 Javascript
js 高效去除数组重复元素示例代码
Dec 19 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
javascript中的遍历for in 以及with的用法
Dec 22 Javascript
AngularJS基础知识笔记之过滤器
May 10 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
Jul 19 jQuery
vue2.0与bootstrap3实现列表分页效果
Nov 28 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
vuex的使用及持久化state的方式详解
Jan 23 Javascript
php结合js实现多条件组合查询
May 28 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中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
新手入门常用代码集锦
2007/01/11 Javascript
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
javascript 动态设置已知select的option的value值的代码
2009/12/16 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
scrapy spider的几种爬取方式实例代码
2018/01/25 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
Java如何支持I18N?
2016/10/31 面试题
数控技术专科生自我评价
2014/01/08 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
谢师宴邀请函
2015/02/02 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
Go语言基础函数基本用法及示例详解
2021/11/17 Golang
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript