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中对数组的操作代码
Aug 12 Javascript
Javascript基础教程之for循环
Jan 18 Javascript
JavaScript计时器示例分析
Feb 05 Javascript
js计算文本框输入的字符数
Oct 23 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
Jan 19 Javascript
Vuejs实现带样式的单文件组件新方法
May 02 Javascript
vue中添加mp3音频文件的方法
Mar 02 Javascript
vue element-ui之怎么封装一个自己的组件的详解
May 20 Javascript
JavaScript展开操作符(Spread operator)详解
Jul 20 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
Sep 23 Javascript
基于vue中的scoped坑点解说
Sep 04 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
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基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
你真的了解JavaScript吗?
2007/02/24 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
常用jQuery代码分享
2015/07/14 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
jQuery利用sort对DOM元素进行排序操作
2016/11/07 Javascript
浅谈使用splice函数对数组中的元素进行删除时的注意事项
2016/12/04 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
js实现批量删除功能
2020/08/27 Javascript
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
对Python w和w+权限的区别详解
2019/01/23 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
饲料采购员岗位职责
2013/12/19 职场文书
烹调加工管理制度
2014/02/04 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
郭明义电影观后感
2015/06/08 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
python中的getter与setter你了解吗
2022/03/24 Python
如何通过简单的代码描述Angular父组件、子组件传值
2022/04/07 Javascript
鸿蒙3.0体验感怎么样? 鸿蒙3.0系统评测向
2022/08/14 数码科技