前端实现下载文件(包含压缩包下载)方式汇总

这篇具有很好参考价值的文章主要介绍了前端实现下载文件(包含压缩包下载)方式汇总。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

默认最简单的下载方式是:window.open(后台接口API路径),但该方法弊端:因是新开窗口方式,前端展示上,每次会闪下。

此外,如果使用window.open(文件URL)方式:

  • pdf、office文档、psd:直接下载。
  • 图片、txt:新开窗口预览,不会下载;且txt预览,有时出现中文乱码问题。

一、根据文件URL下载

实现原理:通过a标签实现下载。

/**
 * @method 下载单个文件(文件类型可任意:.png、txt、office文档、.psd等)
 * @param { String } url - 文件的http完整路径, 如:http: //xxx.png
 * @param { String } fileName - 文件名,注意是要带文件后缀名,如:xxx.png
 * @doc https://blog.csdn.net/weixin_39547158/article/details/110851570
 */
export function downloadFile(url: string, fileName: string) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.upload.onprogress = (e) => {
      if (e.lengthComputable) {
        let progress = e.loaded / e.total;
        console.log('文件上传进度是', progress);
      }
    };
    xhr.onload = function () {
      const url = window.URL.createObjectURL(xhr.response);
      const eleLink = document.createElement('a');
      eleLink.href = url;
      eleLink.download = `${fileName}`;
      eleLink.style.display = 'none';
      document.body.appendChild(eleLink);
      eleLink.click();
      document.body.removeChild(eleLink);
      resolve('success');
    };
    xhr.onerror = (e) => {
      console.log('请求错误回调', e);
      message.warning('下载文件失败')
      reject(e);
    };
    xhr.send();
  });
}

二、excel文件:调用后台接口返回文件流,前端下载文件

实现原理:调用后台接口,返回blob, 前端使用file-saver库实现下载。

// 下载excel文件
import FileSaver from 'file-saver';

const downloadTemplate = async () => {
  try {
    const params = { ... } // 传参
    const res = await generateDownStreamReconciliationUsingGET(params);
    // res为返回结果
    if (res) {
      const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
      FileSaver.saveAs(blob, '对账单.xlsx');
      console.log('对账单下载成功')
    }
  } catch (e) {
    console.log(e);
  } finally {
    console.log('finally')
  }
};
// 生成对账excel模板表格API
export async function generateDownStreamReconciliationUsingGET(
  params: API.generateDownStreamReconciliationUsingGETParams,
  options?: { [key: string]: any },
) {
  return request<any>(
    `${process.env.APP_HOST_WAYBILL}/xxx/generateDownStreamReconciliation`,
    {
      method: 'GET',
      responseType: 'blob',  // 必须写该行,否则:后台返回的是string,不是blob且文件下载后,会出现打不开问题。
      params: {
        ...params,
      },
      ...(options || {}),
    },
  );
}

三、多文件URL下载,前端生成压缩包下载

实现原理:jszip库 + file-saver文章来源地址https://www.toymoban.com/news/detail-688611.html

import { getBlobOfUrl } from '@/services/common';
import { saveAs } from 'file-saver';
import JSZip from 'jszip';
import { message } from 'antd';

/**
 * @method 同时下载多文件,并生成一个压缩包
 * @param { Object[] } fileInfoList - 文件列表
 * @param { String } urlField - 文件URL的字段名
 * @param { String } fileNameField - 文件名的字段名
 * @param { String } folderName - 压缩包 & 文件夹名称
 */
export function downloadAsZip(
  fileInfoList: any[],
  folderName = '文件压缩包',
  urlField = 'filePath',
  fileNameField = 'name',
) {
  return new Promise((resolve, reject) => {
    const zip = new JSZip();
    // const folder = zip.folder(folderName); // 创建文件夹
    const promisesList = fileInfoList.map((item) => {
      return getBlobOfUrl(item[urlField])
        .then((data) => {
          // console.log(data); // Blob
          // folder.file(item[fileNameField], data, { binary: true }); // 往文件夹中存放文件
          zip.file(item[fileNameField], data, { binary: true }); // 不创建文件夹
        })
        .catch((e) => {
          console.log(e);
          message.warning(e?.message || '获取文件流失败')
        });
    });
    Promise.all(promisesList)
      .then(() => {
        zip
          .generateAsync({ type: 'blob' })
          .then((content) => {
            saveAs(content, folderName);
            resolve('success');
          })
          .catch((e) => {
            message.warning(e?.message || '生成压缩包失败')
            reject(e);
          });
      })
      .catch((e) => {
        message.warning(e?.message || '批量获取文件流失败')
        reject(e);
      });
  });
}
import { request } from 'umi';

/**
 * @method 根据文件URL获取blob数据流的API
 * @param { String } fileUrl - 文件完整路径,如:http://xxx.png
 */
export function getBlobOfUrl(fileUrl: string) {
  return request(fileUrl, {
    method: 'GET',
    responseType: 'blob', // 设置后台返回的内容类型为blob
    params: {
      notAuthorization: true,
    },
  });
}

到了这里,关于前端实现下载文件(包含压缩包下载)方式汇总的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端文件下载方法(包含get和post)

    2024年01月15日
    浏览(40)
  • 前端将file文件传给后台,后台将文件传给前台(包含上传下载)

    在开发过程中,经常会遇见对文件的处理。 例如:在上传、下载文件时,需要在前端选完文件传到后台传到服务器;或者文件从后台,经过特定需求的处理在返回给前台。 中间处理过程各种各样,但有两个过程是固定的 前端传给后台 后台返回给前端 经常用到的上传就是对

    2024年02月11日
    浏览(53)
  • 前端调接口下载(导出)后端返回.zip压缩文件流(的坑!)

    前言:基于vue2+element-ui的一个后台管理系统,需求评审要加一个导入导出文件的功能,由于可能导出的数据量过大(几十万条数据),下载时间过长,所以用.zip压缩文件替代excel文件 本人以前也做过导出文件的功能,但是用的方法是后端处理数据然后放到另一个服务器上,前

    2024年02月03日
    浏览(50)
  • 前端下载文件的几种方式使用Blob下载文件

    前端下载文件的几种方式 使用Blob下载文件 在前端下载文件是个很通用的需求,一般后端会提供下载的方式有两种: 1.直接返回文件的 网络地址 (一般用在静态文件上,比如图片以及各种音视频资源等) 2.返回 文件流 (一般用在动态文件上,比如根据前端选择,导出不同的

    2024年02月05日
    浏览(52)
  • 前端几种下载文件的方式(url方式和文件流方式)

    前端实现下载功能是依赖于浏览器特性,而非JS特性 前端如何实现文件下载,防止浏览器自动打开可预览文件 https://blog.csdn.net/weixin_46074961/article/details/105677732 1.location.href 下载文件–window-location-href 对于浏览器不能打开的文件(例如:.rar .doc等)是可以实现文件下载的,但是对于浏

    2024年02月06日
    浏览(42)
  • 前端下载文件(Blob)的几种方式使用Blob下载文件

    在前端下载文件是个很通用的需求,一般后端会提供下载的方式有两种: 1.直接返回文件的网络地址(一般用在静态文件上,比如图片以及各种音视频资源等) 2.返回文件流(一般用在动态文件上,比如根据前端选择,导出不同的统计结果 excel 等) 第一种方式比较简单,但

    2024年02月07日
    浏览(60)
  • java解压缩(上传和下载)zip压缩包[超详细]包含[前后端]

    在日常中,我们想在没有网络的情况下进行将一个项目中的数据,导入另一个项目中,从而实现数据之前的转换和迁移。这时候,我们可以通过生成压缩包,和解压zip压缩包的形式,将数据进行各种迁移,接下来就让我们开始吧。 因为我使用的是vue2,所以就按照vue2的形式来

    2024年01月21日
    浏览(40)
  • 使用serverless实现从oss下载文件并压缩

            公司之前开发一个网盘系统, 可以上传文件, 打包压缩下载文件, 但是在处理大文件的时候, 服务器遇到了性能问题, 主要是这个项目是单机部署.......(离谱),  然后带宽只有100M, 现在用户比之前多很多, 然后所有人的压缩下载请求都给到这一台服务器了, 比如多个人下

    2024年02月15日
    浏览(32)
  • Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载

    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦。这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了。 下面是一个名为CompressUtil的工具类的代码,它提供了一些方法来处理文件压

    2024年02月06日
    浏览(57)
  • Spring Boot实现对超大文件进行异步压缩下载

     在Web应用中,文件下载功能是一个常见的需求,特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API,通过该API,用户可以下载问价为ZIP压缩文件。 首先,确保你已经创建了一个

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包