一、檔案上傳
1、普通檔案上傳
JavaScript 可以使用表單提交來實作檔案上傳,首先,在 HTML 中創建一個檔案輸入框:
<input type="file" id="fileInput">
然后,在 JavaScript 中獲取檔案輸入框的參考,并在其上設定事件監聽器,如下所示:
var fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function () {
// 在這里處理選擇的檔案
});
在事件監聽器中,可以使用 fileInput.files[0] 屬性獲取選擇的檔案,然后對檔案進行處理,
接下來可以使用 XMLHttpRequest 或 fetch API 來上傳檔案,
使用 XMLHttpRequest:
var file = fileInput.files[0];
var formData = https://www.cnblogs.com/yuzhihui/p/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 = https://www.cnblogs.com/yuzhihui/p/new FormData();
formData.append('file', file);
fetch('url', {
method: 'POST',
body: formData
}).then(response => {
if (response.ok) {
console.log('upload success');
}
});
另外還可以使用第三方庫如 axios 來實作檔案上傳,具體實作方法可以參考相關檔案,
2、大檔案上傳
在上傳大檔案時,通常采用分塊上傳的方式,將大檔案分成若干個塊,每塊一個 HTTP 請求上傳,
實作大檔案上傳的步驟如下:
- 用戶選擇檔案,
- 將檔案分成若干塊,
- 對于每一塊,向服務器發送 HTTP 請求上傳,
- 服務器接收到檔案塊后,將其存盤在服務器上,
- 在所有塊上傳完成后,服務器將所有塊合并成一個完整的檔案,
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 = "https://www.cnblogs.com/yuzhihui/p/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 = https://www.cnblogs.com/yuzhihui/p/url;
link.download ='filename';
link.click();
URL.revokeObjectURL(url);
document.body.removeChild(link);
});
作者:yuzhihui
出處:http://www.cnblogs.com/yuzhihui/ 宣告:歡迎任何形式的轉載,但請務必注明出處!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/542557.html
標籤:JavaScript
下一篇:Angularjs的工程化
