JavaScript 文件上傳與下載

来源:https://www.cnblogs.com/yuzhihui/archive/2023/01/29/17072894.html
-Advertisement-
Play Games

一、文件上傳 1、普通文件上傳 JavaScript 可以使用表單提交來實現文件上傳。首先,在 HTML 中創建一個文件輸入框: <input type="file" id="fileInput"> 然後,在 JavaScript 中獲取文件輸入框的引用,併在其上設置事件監聽器,如下所示: var ...


一、文件上傳

1、普通文件上傳

JavaScript 可以使用表單提交來實現文件上傳。首先,在 HTML 中創建一個文件輸入框:

<input type="file" id="fileInput">

然後,在 JavaScript 中獲取文件輸入框的引用,併在其上設置事件監聽器,如下所示:

var fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function () {
  // 在這裡處理選擇的文件
});

在事件監聽器中,可以使用 fileInput.files[0] 屬性獲取選擇的文件,然後對文件進行處理。

接下來可以使用 XMLHttpRequestfetch API 來上傳文件。

使用 XMLHttpRequest

var file = fileInput.files[0];
var formData = new FormData();
formData.append('file', file);

var xhr = new XMLHttpRequest();
xhr.open('POST', 'url', true);
xhr.onload = function () {
  if (xhr.status === 200) {
    console.log('upload success');
  }
};
xhr.send(formData);

使用 fetch

var file = fileInput.files[0];
var formData = new FormData();
formData.append('file', file);

fetch('url', {
  method: 'POST',
  body: formData
}).then(response => {
  if (response.ok) {
    console.log('upload success');
  }
});

另外還可以使用第三方庫如 axios 來實現文件上傳,具體實現方法可以參考相關文檔。

2、大文件上傳

在上傳大文件時,通常採用分塊上傳的方式。將大文件分成若幹個塊,每塊一個 HTTP 請求上傳。

實現大文件上傳的步驟如下:

  1. 用戶選擇文件。
  2. 將文件分成若幹塊。
  3. 對於每一塊,向伺服器發送 HTTP 請求上傳。
  4. 伺服器接收到文件塊後,將其存儲在伺服器上。
  5. 在所有塊上傳完成後,伺服器將所有塊合併成一個完整的文件。

JavaScript 可以使用 File API(File 和 Blob 對象)來實現文件的讀取和上傳。

下麵是一個使用 JavaScript 實現大文件上傳的簡單實例,使用分塊上傳的方法。

<input type="file" id="file-input">

 

// 上傳文件塊
function uploadChunk(file, start, end, chunk) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/upload', true);
    xhr.setRequestHeader('Content-Type', 'application/octet-stream');
    xhr.setRequestHeader('Content-Range', 'bytes ' + start + '-' + end + '/' + file.size);
    xhr.send(chunk);
}

// 上傳文件
function uploadFile(file) {
    var chunkSize = 1 * 1024 * 1024; // 分塊大小為1MB
    var chunks = Math.ceil(file.size / chunkSize); // 計算分塊數
    var currentChunk = 0; // 當前分塊
    var start, end;
    while (currentChunk < chunks) {
        start = currentChunk * chunkSize;
        end = start + chunkSize >= file.size ? file.size : start + chunkSize;
        var chunk = file.slice(start, end);
        uploadChunk(file, start, end, chunk);
        currentChunk++;
    }
}

// 監聽文件選擇事件
document.getElementById('file-input').addEventListener('change', function(e) {
    var file = e.target.files[0];
    if (file) {
        uploadFile(file);
    }
});

在這個實例中,我們使用了 XMLHttpRequest 對象上傳文件,並設置了 Content-Type 和 Content-Range 消息頭。Content-Type 消息頭表示上傳的數據類型是二進位數據,Content-Range 消息頭表示上傳的文件塊的範圍。

在這個示例中,我們將文件分成若幹塊,每塊大小為 1MB。我們使用 File API 中的 slice 方法截取文件塊,並使用 XMLHttpRequest 將文件塊上傳到伺服器。

註意,這隻是一個簡單的實例,代碼僅供參考,在實際應用中還需要考在考慮以下幾點:

  • 如果伺服器端支持斷點續傳,可以在伺服器端記錄已經上傳的文件塊,避免重覆上傳。
  • 需要考慮如何處理上傳失敗的文件塊,是否需要重試。
  • 在上傳過程中需要提供進度條,讓用戶瞭解上傳進度。
  • 在上傳完成後需要有反饋,告知用戶上傳是否成功。
  • 伺服器端如何處理上傳的文件塊,將其合併成一個完整的文件。
  • 伺服器端存儲空間的問題。可以使用分散式文件系統(如 HDFS)或雲存儲(如 Amazon S3)來存儲上傳的文件。
  • 文件塊上傳順序、文件塊校驗、斷點續傳等問題。

通過分塊上傳的方式,我們可以將大文件分成若幹塊上傳,避免一次性上傳大文件造成的超時或者記憶體不足的問題,同時也方便實現斷點續傳和上傳進度的顯示。

 

除了上面提到的方法外,還可以使用第三方庫來實現大文件上傳。常見的第三方庫有:

  • resumable.js
  • plupload
  • fine-uploader
  • tus-js-client

這些庫都提供了文件分塊、斷點續傳、上傳進度等功能,可以讓你更快捷地實現大文件上傳。

不過要註意的是,使用第三方庫可能會增加代碼的複雜性和對第三方庫的依賴。在選擇使用第三方庫時需要權衡其優缺點,並確保它滿足你的需求。

 

關於文件上傳需要瞭解的知識點:

  • HTML5 文件上傳
  • 文件上傳技術
  • 文件上傳安全性
  • 分塊上傳
  • 斷點續傳
  • 雲存儲

二、文件下載

在 JavaScript 中實現文件下載,常見的方法如下:

1、使用 window.location 實現:通過更改當前頁面的 URL 為文件下載地址,從而實現下載。

window.location = 'file-download-url';

2、使用 a 標簽實現:通過創建一個 a 標簽並設置其 href 和 download 屬性,從而實現下載。

var link = document.createElement("a");
link.download = "filename";
link.href = "file-download-url";
link.click();

3、使用 fetch API 實現:通過使用 fetch API 獲取文件內容,並將其寫入 Blob 對象,最後利用 URL.createObjectURL 將其下載。

fetch('file-download-url')
  .then(response => response.blob())
  .then(blob => {
    const url = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = url;
    link.download = 'filename';
    link.click();
    URL.revokeObjectURL(url);
    document.body.removeChild(link);
  });

 

作者:yuzhihui
出處:http://www.cnblogs.com/yuzhihui/ 聲明:歡迎任何形式的轉載,但請務必註明出處!!!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 怎麼從菜鳥程式員變成架構師 一、正確理解架構師的工作 架構師一般是不會去探討業務的範疇,他是把整個項目的結構搭出來,並讓程式員去填肉(業務功能部分) ,一般架構師的好壞決定這個項目的工期與質量,現在市面上看見的架構師一般都是別人的框架直接拿來用的,所以就不存在技術提升的範疇。很少會自己搭建框架。如果 ...
  • 一 引入 考慮實現一種機械泵控制項。 機械泵是工業中通常用來製造真空的一類設備,我們在繪製界面UI時希望可以生動形象地來表述一個機械泵,下麵講述了一種簡單的實現。 二 MechanicalPumpControl 聲明一個MechanicalPumpControl的自定義控制項,它繼承自Control類。 ...
  • 前言 Keil C51 是 51 系列相容單片機 C 語言軟體開發系統,支持 8051 微控制器體繫結構的 Keil 開發工具,適合每個階段的開發人員,不管是專業的應用工程師,還是剛學習嵌入式軟體開發的學生。 本篇博主將詳細介紹嵌入式集成開發環境 Keil C51 的安裝與註冊方法,以及國產 STC ...
  • xz是什麼 高壓縮率的工具,它使用 LZMA2 壓縮演算法,生成的壓縮文件比傳統使用的 gzip、bzip2 生成的壓縮文件更小, 不過xz也有一個壞處就是壓縮時間比較長,比7z壓縮時間還長一些。不過壓縮主要用於歸檔,不介意的可以忽略。 擅長壓縮文本和日誌文件,針對這塊的壓縮率,是目前我發現效率最高的 ...
  • Docker的常用命令 幫助命令 docker version # docker版本 docker info # 顯示docker的系統信息,包括鏡像和容器的數量 docker [命令] --help # 查看某個具體的命令 鏡像命令 查看下載的所有鏡像 # docker images REPOSI ...
  • 一:背景 1. 講故事 大家都知道資料庫應用程式 它天生需要圍繞著數據文件打轉,諸如包含數據的 .mdf,事務日誌的 .ldf,很多時候深入瞭解這兩類文件的合成原理,差不多對資料庫就能理解一半了,關於 .mdf 的合成前面的文章已經有所介紹,這篇我們來聊一下 .ldf 的一些內部知識,比如 LSN。 ...
  • props props簡單使用 class Person extends React.Component { render() { return ( <ul> <li>姓名:{this.props.name}</li> <li>年齡:{this.props.age}</li> <li>性別:{thi ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 需求描述 目前大多數PC端應用都有配套的移動端APP,如微信,淘寶等,通過使用手機APP上的掃一掃功能去掃頁面二維碼圖片進行登錄,使得用戶登錄操作更方便,安全,快捷。 思路解析 PC 掃碼原理? 掃碼登錄功能涉及到網頁端、伺服器和手機端, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...