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 相关文章推荐
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 Javascript
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
jQuery之排序组件的深入解析
Jun 19 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
Oct 17 Javascript
JS中的进制转换以及作用
Jun 26 Javascript
Easy UI动态树点击文字实现展开关闭功能
Sep 30 Javascript
详解小程序缓存插件(mrc)
Aug 17 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
Javascript模块化机制实现原理详解
Apr 02 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 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中var_export与var_dump的区别分析
2010/08/21 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
ptyhon实现sitemap生成示例
2014/03/30 Python
Python优化技巧之利用ctypes提高执行速度
2016/09/11 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
保安自我鉴定范文
2013/12/08 职场文书
小学教师事迹材料
2014/01/13 职场文书
遗产继承公证书
2014/04/09 职场文书
工商干部先进事迹
2014/05/14 职场文书
大学新生入学教育方案
2014/05/16 职场文书
火箭队口号
2014/06/18 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python