最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端實(shí)現(xiàn)下載文件(包含壓縮包下載)方式詳細(xì)總結(jié)

 更新時(shí)間:2023年09月10日 14:55:53   作者:qq_38969618  
這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)下載文件(包含壓縮包下載)方式的相關(guān)資料,這段時(shí)間項(xiàng)目需要下載文件,所以這里給大家總結(jié)下,需要的朋友可以參考下

前言

默認(rèn)最簡單的下載方式是:window.open(后臺(tái)接口API路徑),但該方法弊端:因是新開窗口方式,前端展示上,每次會(huì)閃下。

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

  • pdf、office文檔、psd:直接下載。
  • 圖片、txt:新開窗口預(yù)覽,不會(huì)下載;且txt預(yù)覽,有時(shí)出現(xiàn)中文亂碼問題。

一、根據(jù)文件URL下載

實(shí)現(xiàn)原理:通過a標(biāo)簽實(shí)現(xiàn)下載。

/**
 * @method 下載單個(gè)文件(文件類型可任意:.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('文件上傳進(jìn)度是', 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('請(qǐng)求錯(cuò)誤回調(diào)', e);
      message.warning('下載文件失敗')
      reject(e);
    };
    xhr.send();
  });
}

二、excel文件:調(diào)用后臺(tái)接口返回文件流,前端下載文件

實(shí)現(xiàn)原理:調(diào)用后臺(tái)接口,返回blob, 前端使用file-saver庫實(shí)現(xiàn)下載。

// 下載excel文件
import { saveAs } from 'file-saver';
const downloadTemplate = async () => {
  try {
    const params = { ... } // 傳參
    const res = await generateDownStreamReconciliationUsingGET(params);
    // res為返回結(jié)果
    if (res) {
      const blob = new Blob([res], { type: 'application/vnd.ms-excel' });
      FileSaver.saveAs(blob, '對(duì)賬單.xlsx');
      console.log('對(duì)賬單下載成功')
    }
  } catch (e) {
    console.log(e);
  } finally {
    console.log('finally')
  }
};
// 生成對(duì)賬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',  // 必須寫該行,否則:后臺(tái)返回的是string,不是blob且文件下載后,會(huì)出現(xiàn)打不開問題。
      params: {
        ...params,
      },
      ...(options || {}),
    },
  );
}

三、多文件URL下載,前端生成壓縮包下載

實(shí)現(xiàn)原理:jszip庫 + file-saver庫

import { getBlobOfUrl } from '@/services/common';
import { saveAs } from 'file-saver';
import JSZip from 'jszip';
import { message } from 'antd';
/**
 * @method 同時(shí)下載多文件,并生成一個(gè)壓縮包
 * @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); // 創(chuàng)建文件夾
    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 }); // 不創(chuàng)建文件夾
        })
        .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 根據(jù)文件URL獲取blob數(shù)據(jù)流的API
 * @param { String } fileUrl - 文件完整路徑,如:http://xxx.png
 */
export function getBlobOfUrl(fileUrl: string) {
  return request(fileUrl, {
    method: 'GET',
    responseType: 'blob', // 設(shè)置后臺(tái)返回的內(nèi)容類型為blob
    params: {
      notAuthorization: true,
    },
  });
}

總結(jié) 

到此這篇關(guān)于前端實(shí)現(xiàn)下載文件(包含壓縮包下載)方式的文章就介紹到這了,更多相關(guān)前端實(shí)現(xiàn)下載文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在JavaScript中使用高階函數(shù)的方法

    在JavaScript中使用高階函數(shù)的方法

    JavaScript可以接受高階函數(shù)。這種處理高階函數(shù)的能力以及其他特點(diǎn),使JavaScript成為非常適合函數(shù)式編程的編程語言之一,這篇文章主要介紹了如何在JavaScript中使用高階函數(shù),需要的朋友可以參考下
    2022-09-09
  • 關(guān)于Javascript回調(diào)函數(shù)的一個(gè)妙用

    關(guān)于Javascript回調(diào)函數(shù)的一個(gè)妙用

    相信在剛開始學(xué)習(xí)JavaScript的時(shí)候,很多人感到最困惑的就是回調(diào)函數(shù)了。本文通過一個(gè)小小的例子來分析回調(diào)函數(shù)的用法。對(duì)大家學(xué)習(xí)Javascript回調(diào)函數(shù)很有幫助,有需要的可以來參考學(xué)習(xí)。
    2016-08-08
  • Js中foreach()用法及使用的坑記錄

    Js中foreach()用法及使用的坑記錄

    這篇文章主要介紹了Js中foreach()用法及使用的坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • JQuery+DIV自定義滾動(dòng)條樣式的具體實(shí)現(xiàn)

    JQuery+DIV自定義滾動(dòng)條樣式的具體實(shí)現(xiàn)

    用DIV和DIV自身的滾動(dòng)條相互控制內(nèi)容的滾動(dòng),DIV自身的滾動(dòng)條樣式可以用DIV層覆蓋,重寫滾動(dòng)條樣式
    2013-06-06
  • 一文解決前端JS小數(shù)運(yùn)算精度問題

    一文解決前端JS小數(shù)運(yùn)算精度問題

    在做項(xiàng)目的時(shí)候,前端需要在表格的底部做一個(gè)匯總的功能,在采用reduce對(duì)當(dāng)前屬性所有值匯總時(shí),發(fā)現(xiàn)匯總結(jié)果存在好長的小數(shù)位,本文給大家介紹了如何解決前端JS小數(shù)運(yùn)算精度問題,需要的朋友可以參考下
    2024-02-02
  • 如何解決ligerUI布局時(shí)Center中的Tab高度大小

    如何解決ligerUI布局時(shí)Center中的Tab高度大小

    這篇文章主要介紹了如何解決ligerUI布局時(shí)Center中的Tab高度大小的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • JavaScript獲取當(dāng)前網(wǎng)頁標(biāo)題(title)的方法

    JavaScript獲取當(dāng)前網(wǎng)頁標(biāo)題(title)的方法

    這篇文章主要介紹了JavaScript獲取當(dāng)前網(wǎng)頁標(biāo)題(title)的方法,涉及javascript中document.title方法的使用,需要的朋友可以參考下
    2015-04-04
  • js 關(guān)于=+與+=日期函數(shù)使用說明(賦值運(yùn)算符)

    js 關(guān)于=+與+=日期函數(shù)使用說明(賦值運(yùn)算符)

    js 關(guān)于=+與+=日期函數(shù)使用說明(賦值運(yùn)算符),可以看下,就是一些運(yùn)算符的使用,看哪個(gè)更適合你。
    2011-11-11
  • 小程序webView實(shí)現(xiàn)小程序內(nèi)嵌H5頁面的全過程

    小程序webView實(shí)現(xiàn)小程序內(nèi)嵌H5頁面的全過程

    在微信小程序中內(nèi)嵌H5頁面是一種常見的需求,因?yàn)镠5頁面具有靈活性和跨平臺(tái)性,可以彌補(bǔ)小程序原生代碼的不足,這篇文章主要給大家介紹了關(guān)于小程序webView實(shí)現(xiàn)小程序內(nèi)嵌H5頁面的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • JS面向?qū)ο笾噙x框?qū)崿F(xiàn)

    JS面向?qū)ο笾噙x框?qū)崿F(xiàn)

    這篇文章主要為大家詳細(xì)介紹了JS面向?qū)ο笾噙x框?qū)崿F(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01

最新評(píng)論

闻喜县| 普兰店市| 芜湖市| 武义县| 闻喜县| 新丰县| 梅州市| 海城市| 田东县| 满洲里市| 文昌市| 白水县| 崇文区| 兴城市| 忻州市| 札达县| 永兴县| 台北县| 江门市| 吉安市| 南投市| 洪江市| 新干县| 昌宁县| 赤峰市| 东莞市| 湖南省| 新龙县| 中西区| 即墨市| 东明县| 彩票| 台东县| 景泰县| 冷水江市| 勐海县| 滦平县| 沙洋县| 拉萨市| 滁州市| 田林县|