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 相关文章推荐
(推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
Apr 29 Javascript
简单的JS多重继承示例
Mar 13 Javascript
XmlUtils JS操作XML工具类
Oct 01 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
Jul 26 Javascript
简单的前端js+ajax 购物车框架(入门篇)
Oct 29 Javascript
浅析XMLHttpRequest的缓存问题
Dec 13 Javascript
Javascript基础知识(一)核心基础语法与事件模型
Sep 29 Javascript
javascript中setAttribute()函数使用方法及兼容性
Jul 19 Javascript
js实现五星评价功能
Mar 08 Javascript
微信小程序自定义菜单切换栏tabbar组件代码实例
Dec 30 Javascript
vue-router之解决addRoutes使用遇到的坑
Jul 19 Javascript
JavaScript实现手风琴效果
Feb 18 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中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
python简单实现旋转图片的方法
2015/05/30 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
详解Python 中的容器 collections
2020/08/17 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
用Python进行websocket接口测试
2020/10/16 Python
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
公司年会策划方案
2014/05/17 职场文书
羽毛球比赛策划方案
2014/06/13 职场文书
求职推荐信范文
2015/03/27 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python