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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...