前端实现下载功能的方法

9,909次阅读
没有评论

共计 2977 个字符,预计需要花费 8 分钟才能阅读完成。

前言

下载功能目前是前端项目中比较常用的功能,但刚开始写项目可能不知道如何下手,鄙人刚写的时候也一头雾水,昨天刚完成了 get 请求传参的下载,鄙人前端小白,期待指正。

get 请求传参的下载

首先需要对 axios 做一个小小的封装,每个人的封装方法都各有不同不做过多赘述。

下载接口的封装如下。

import request from "@/utils/downLoad" // 引用自己封装好的 axios
 // 封装下载的接口,导出。export function down(url:string,params:any){
  return request({
    url: url,// 后端要求的接地址
    method:'get',//get 方法
    params:params,// 后端要求的参数
    responseType:'blob'// 关键之处,下载文件的 responseType 设置为 'blob'
  })
}

在需要下载的组件内引用,把自己的接口地址和要传的参数替换一下,看一下下载的文件类型。

import {down} from '@/server/http/http' // 路径是刚才封装的下载接口的路径

//html 页面
  下载模板 

//js 页面
        const downTemplate = () => {down('/planInfo/planTemplateExport', { planId: props.id}).then((res: any) => {const blob = new Blob([res.data], 
                  { type: "application/vnd.ms-excel" 
        // 此处是下载的文件类型,get 请求一般后端都会设置好文件类型,要和后端沟通好,不同的文件类型 type 也会不同,我这里是下载了 excel 文件 });
                let url = window.URL.createObjectURL(blob);
                if ("download" in document.createElement("a")) {
                    try {let link = document.createElement("a");
                        link.style.display = "none";
                        link.href = url;
                        link.setAttribute("download", '下载模板');
                        document.body.appendChild(link);
                        link.click();
                        link.remove()} catch (e) {console.log(e)
                    }
                }
            })
        }

以上就是本人写的 get 请求下载文件,欢迎留言指正!

这种方法可以满足大部分的下载需求,注意 type 那里,容易报错。

———————————————————————————————–

2023.3.28 更新

get 和 post 封装一下

export function downLoadFile(method: any, url: any, options?: any) {let xhr = new XMLHttpRequest();        // 定义 http 请求对象
  xhr.open(method, url, true);// 根据接口使用请求方式
  xhr.responseType = "blob";  // 返回类型 blob
  xhr.setRequestHeader("Authorization", store.state.token);
  if (method === 'post') {xhr.setRequestHeader("Content-type", "application/json;charset=UTF-8");
    xhr.send(JSON.stringify(options))
  } else {xhr.setRequestHeader("Content-type", "application/x-msdownload");
    xhr.send()}
 // 定义请求完成的处理函数, 请求前可以增加加载框 / 禁用下载按钮逻辑
  xhr.onload = function (response: any) {// console.log('response', response);
    // console.log('this', this);
    // console.log('xhr', xhr);


    if (this.status === 200) {
      // 请求完成
      var blob = this.response;
      var reader = new FileReader();
      reader.readAsDataURL(blob);  // 转换为 base64,可以直接放入 a 标签 href
      reader.onload = function (e: any) {// console.log(e);            // 查看有没有接收到数据流
        // 转换完成,创建一个 a 标签用于下载
        var link = document.createElement('a');
        // link.download = '';            // 此处填写文件地址
        // console.log(xhr.getAllResponseHeaders());

        var resHeader: any = xhr.getResponseHeader('Content-Disposition') // 获取响应消息头
        let temp = resHeader.split(";")[1].split("fileName=")[1];
        let fileName = decodeURIComponent(temp);
        link.setAttribute('download', fileName)
        link.href = e.target.result;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      }
    }
    else {message.error('未知的错误! 文件下载失败')
    }
  }
  // xhr.send();}

调接口就把这个方法再次封装暴露出去,以下是我的一个案例,可以将自己的接口替代掉

// 附件
export function DownLoadgetEntrustFileUrls(url: number) {downLoadFile('get', `${config.DownLoadUrl}/jkyErp/web/file_output_stream/getEntrustFileUrls?url=${url}`)
}
// 这里的 config.DownLoadUrl 是又做了一个封装,也就是 baseUrl, 跳了好几层,总之这里就是 baseUrl
//url 是页面传的参数

export function getApiBaseLoadUrl() {
    const baseUrl = process.env.VUE_APP_PROXY === 'true'
        ? `${PROXY_DOWN_PATH}`
        : process.env.VUE_APP_BASE_API
    return baseUrl
}

页面中引用

const downloadFJ = (url: any) => {DownLoadgetEntrustFileUrls(url);
    };
//url 穿参 

总结,这种方法,看起来比较繁琐,看个人需求。

原文地址: 前端实现下载功能的方法

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-07发表,共计2977字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)