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
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...