欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端實(shí)現(xiàn)文件下載的4種常見(jiàn)方式與實(shí)戰(zhàn)示例

 更新時(shí)間:2025年04月16日 08:34:03   作者:阿達(dá)C  
在前端開(kāi)發(fā)中,實(shí)現(xiàn)文件下載是一個(gè)非常常見(jiàn)的需求,本篇文章將介紹 4 種前端文件下載的方式,并提供詳細(xì)示例,希望能幫助大家掌握文件下載的各種技巧

引言

在前端開(kāi)發(fā)中,實(shí)現(xiàn)文件下載是一個(gè)非常常見(jiàn)的需求,例如:

  • 下載圖片、PDF、Excel 等文件
  • 將前端生成的數(shù)據(jù)導(dǎo)出為文件(如 JSON、CSV、Excel)
  • 使用 Blob、Data URL、Stream 方式進(jìn)行下載

本篇文章將介紹 4 種前端文件下載的方式,并提供詳細(xì)示例,幫助你掌握文件下載的各種技巧。

1. 直接使用 <a> 標(biāo)簽下載(適用于靜態(tài)文件)

原理

HTML <a> 標(biāo)簽的 download 屬性可以直接下載鏈接文件,無(wú)需 JavaScript 處理。

示例:下載本地文件

<a href="/files/example.pdf" rel="external nofollow"  download="example.pdf">下載 PDF 文件</a>

說(shuō)明:

  • href="/files/example.pdf" 指向文件路徑
  • download="example.pdf" 指定下載時(shí)的文件名稱

示例:下載網(wǎng)絡(luò)圖片

<a  rel="external nofollow"  download="my-image.jpg">下載圖片</a>

注意:

  • 僅適用于同源文件
  • 跨域文件 需要服務(wù)器支持 Access-Control-Allow-Origin

2. 使用 JavaScript Blob 方式下載文件

原理

Blob(二進(jìn)制大對(duì)象)可以用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù),并創(chuàng)建可下載的 URL。

示例:下載文本文件

function downloadTextFile() {
    const content = "Hello, this is a text file!";
    const blob = new Blob([content], { type: "text/plain" }); // 創(chuàng)建 Blob
    const url = URL.createObjectURL(blob); // 生成臨時(shí) URL

    const a = document.createElement("a");
    a.href = url;
    a.download = "example.txt"; // 設(shè)置下載文件名
    document.body.appendChild(a);
    a.click(); // 觸發(fā)下載
    document.body.removeChild(a);
    URL.revokeObjectURL(url); // 釋放 URL
}

downloadTextFile();

適用場(chǎng)景:前端生成文件,如文本、JSON、CSV、HTML。

3. 使用 fetch 下載文件(適用于后端 API 提供的文件)

原理

使用 fetch() 請(qǐng)求文件,并將其轉(zhuǎn)換為 Blob 進(jìn)行下載。

示例:下載后端提供的文件

async function downloadFileFromServer(url, filename) {
    const response = await fetch(url);
    const blob = await response.blob(); // 將響應(yīng)轉(zhuǎn)換為 Blob

    const a = document.createElement("a");
    a.href = URL.createObjectURL(blob);
    a.download = filename;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(a.href);
}

// 調(diào)用示例
downloadFileFromServer("https://example.com/report.pdf", "report.pdf");

適用場(chǎng)景:

  • 后端提供的文件下載
  • Excel、PDF、圖片等二進(jìn)制文件

4. 使用 canvas 生成圖片并下載

原理

canvas.toBlob() 可以將 canvas 畫(huà)布轉(zhuǎn)換為 Blob,然后使用 URL.createObjectURL() 進(jìn)行下載。

示例:下載 canvas 生成的圖片

<canvas id="myCanvas" width="200" height="200"></canvas>
<button onclick="downloadCanvas()">下載圖片</button>

<script>
function downloadCanvas() {
    const canvas = document.getElementById("myCanvas");
    const ctx = canvas.getContext("2d");

    // 畫(huà)一個(gè)紅色矩形
    ctx.fillStyle = "red";
    ctx.fillRect(50, 50, 100, 100);

    // 將 canvas 轉(zhuǎn)換為 Blob 并下載
    canvas.toBlob(blob => {
        const url = URL.createObjectURL(blob);
        const a = document.createElement("a");
        a.href = url;
        a.download = "canvas-image.png";
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }, "image/png");
}
</script>

適用場(chǎng)景:截圖、繪圖工具、導(dǎo)出 canvas 生成的圖像。

5. 額外優(yōu)化:進(jìn)度顯示 & 大文件下載

對(duì)于 大文件下載,可以使用 ReadableStream 進(jìn)行流式下載,并顯示進(jìn)度。

示例:下載大文件并顯示進(jìn)度

async function downloadLargeFile(url, filename) {
    const response = await fetch(url);
    const reader = response.body.getReader();
    const contentLength = +response.headers.get("Content-Length");

    let receivedLength = 0;
    let chunks = [];

    while (true) {
        const { done, value } = await reader.read();
        if (done) break;
        chunks.push(value);
        receivedLength += value.length;
        console.log(`下載進(jìn)度:${((receivedLength / contentLength) * 100).toFixed(2)}%`);
    }

    const blob = new Blob(chunks);
    const a = document.createElement("a");
    a.href = URL.createObjectURL(blob);
    a.download = filename;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    URL.revokeObjectURL(a.href);
}

// 調(diào)用示例
downloadLargeFile("https://example.com/large-file.zip", "large-file.zip");

適用場(chǎng)景:大文件下載、斷點(diǎn)續(xù)傳、流式處理。

6. 前端下載文件的最佳實(shí)踐

方法適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
<a> 標(biāo)簽靜態(tài)文件簡(jiǎn)單易用僅適用于同源文件
Blob + URL.createObjectURL()前端生成文件適用于所有文件類型需手動(dòng)釋放 URL
fetch() 方式API 提供的文件下載適用于二進(jìn)制數(shù)據(jù)需處理 CORS 問(wèn)題
canvas.toBlob()生成圖片并下載適用于 canvas僅適用于 canvas 內(nèi)容
流式下載 (ReadableStream)大文件、進(jìn)度控制適合斷點(diǎn)續(xù)傳代碼復(fù)雜

結(jié)論

前端實(shí)現(xiàn)文件下載的方式多種多樣,選擇合適的方式取決于 文件來(lái)源 和 下載需求:

靜態(tài)文件:使用 <a> 標(biāo)簽的 download 屬性(簡(jiǎn)單易用)

動(dòng)態(tài)生成文件:使用 Blob + URL.createObjectURL()

從服務(wù)器下載文件:使用 fetch() 請(qǐng)求文件并轉(zhuǎn)換為 Blob

大文件或流式下載:使用 ReadableStream 進(jìn)行分塊處理

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

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)image組件圖片自適應(yīng)寬度比例顯示的方法

    微信小程序?qū)崿F(xiàn)image組件圖片自適應(yīng)寬度比例顯示的方法

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)image組件圖片自適應(yīng)寬度比例顯示的方法,簡(jiǎn)單講述了image組件的常用屬性,并結(jié)合實(shí)例形式分析了微信小程序?qū)崿F(xiàn)圖片自適應(yīng)寬度比例的相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • JS FormData上傳文件的設(shè)置方法

    JS FormData上傳文件的設(shè)置方法

    使用FormData上傳文件時(shí),總是獲取不到req.file對(duì)象。發(fā)現(xiàn)是沒(méi)有配置對(duì)FormData導(dǎo)致的,怎么解決這個(gè)問(wèn)題呢?下面小編給大家?guī)?lái)了JS FormData上傳文件的設(shè)置方法,需要的朋友參考下吧
    2017-07-07
  • 微信小程序調(diào)用騰訊地圖API文檔JavaScript?SDK和WebService?API詳細(xì)解讀

    微信小程序調(diào)用騰訊地圖API文檔JavaScript?SDK和WebService?API詳細(xì)解讀

    本文介紹了如何使用騰訊位置服務(wù),包括申請(qǐng)開(kāi)發(fā)者密鑰、獲取小程序APPID、下載地圖SDK、設(shè)置服務(wù)器域名白名單等步驟,詳細(xì)說(shuō)明了如何在微信小程序中集成騰訊位置服務(wù),進(jìn)行地圖展示和周邊搜索等功能的實(shí)現(xiàn),同時(shí)提醒注意API的調(diào)用次數(shù)和權(quán)限限制,需要的朋友可以參考下
    2024-09-09
  • javascript顯示中文日期的方法

    javascript顯示中文日期的方法

    這篇文章主要介紹了javascript顯示中文日期的方法,涉及javascript針對(duì)日期與字符串操作技巧,需要的朋友可以參考下
    2015-06-06
  • Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串

    Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串

    這篇文章主要介紹Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串的方法,通俗易懂,需要的朋友可以參考下。
    2016-06-06
  • js中使用replace方法完成某個(gè)字符的轉(zhuǎn)換

    js中使用replace方法完成某個(gè)字符的轉(zhuǎn)換

    這篇文章主要介紹了js中使用replace方法完成某個(gè)字符的轉(zhuǎn)換,比較實(shí)用,需要的朋友可以參考下
    2014-08-08
  • JavaScript中的10個(gè)常見(jiàn)錯(cuò)誤及解決方法

    JavaScript中的10個(gè)常見(jiàn)錯(cuò)誤及解決方法

    JavaScript 作為最流行的編程語(yǔ)言之一,為絕大多數(shù)網(wǎng)站和應(yīng)用提供動(dòng)力,然而,其靈活性和動(dòng)態(tài)特性有時(shí)會(huì)導(dǎo)致常見(jiàn)錯(cuò)誤,本文將探討 JavaScript 中的 10 個(gè)常見(jiàn)錯(cuò)誤,并提供相應(yīng)的解決方案,需要的朋友可以參考下
    2024-09-09
  • 詳解javaScript中Number數(shù)字類型的使用

    詳解javaScript中Number數(shù)字類型的使用

    Number和Math都屬于JavaScript中的內(nèi)置對(duì)象,Number數(shù)字類型作為基礎(chǔ)數(shù)據(jù)類型,我們?cè)陂_(kāi)發(fā)過(guò)程中會(huì)經(jīng)常用到,包括數(shù)字精度的格式化,還有字符串轉(zhuǎn)換成數(shù)字等操作。本文將詳細(xì)講解其用法,感興趣的可以了解一下
    2022-04-04
  • JavaScript解決單線程缺陷webWorker問(wèn)題

    JavaScript解決單線程缺陷webWorker問(wèn)題

    Web Worker 為 Web 內(nèi)容在后臺(tái)線程中運(yùn)行腳本提供了一種簡(jiǎn)單的方法,本文給大家介紹JavaScript解決單線程缺陷——webWorker,需要的朋友可以參考下
    2023-06-06
  • 基于javascript實(shí)現(xiàn)listbox左右移動(dòng)

    基于javascript實(shí)現(xiàn)listbox左右移動(dòng)

    這篇文章主要介紹了基于javascript實(shí)現(xiàn)listbox左右移動(dòng)的相關(guān)資料,以一個(gè)完整的實(shí)例代碼分析了js實(shí)現(xiàn)listbox左右移動(dòng)的相關(guān)技巧,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評(píng)論