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 链式延迟执行DOME
Jan 04 Javascript
下载文件个别浏览器文件名乱码解决办法
Mar 19 Javascript
jquery使用slideDown实现模块缓慢拉出效果的方法
Mar 27 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
Apr 15 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
用js制作淘宝放大镜效果
Oct 28 Javascript
BootStrap的两种模态框方式
May 10 Javascript
详解React中的组件通信问题
Jul 31 Javascript
详解利用Angular实现多团队模块化SPA开发框架
Nov 27 Javascript
vue.js element-ui validate中代码不执行问题解决方法
Dec 18 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
Jun 29 Javascript
React实现todolist功能
Dec 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
克隆一个新项目的快捷方式
2013/04/10 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
CentOS安装php v8js教程
2015/02/26 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
详解Laravel视图间共享数据与视图Composer
2016/08/04 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
dtree 网页树状菜单及传递对象集合到js内,动态生成节点
2012/04/14 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
JS功能代码集锦
2016/05/04 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
详解handlebars+require基本使用方法
2016/12/21 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
使用vue.js写一个tab选项卡效果
2017/03/25 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python 读写中文json的实例详解
2017/10/29 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
如何搭建pytorch环境的方法步骤
2020/05/06 Python
CSS3 icon font完全指南(CSS3 font 会取代icon图标)
2013/01/06 HTML / CSS
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
致标枪运动员加油稿
2014/02/15 职场文书
分家协议书
2014/04/21 职场文书
我的教育故事演讲稿
2014/05/04 职场文书
运动会演讲稿200字
2014/08/25 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
学生检讨书
2015/01/27 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python