一、檔案上傳
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 = 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 請求上傳。
實現大檔案上傳的步驟如下:
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 將檔案塊上傳到伺服器。
注意,這只是一個簡單的範例,程式碼僅供參考,在實際應用中還需要考在考慮以下幾點:
通過分塊上傳的方式,我們可以將大檔案分成若干塊上傳,避免一次性上傳大檔案造成的超時或者記憶體不足的問題,同時也方便實現斷點續傳和上傳進度的顯示。
除了上面提到的方法外,還可以使用第三方庫來實現大檔案上傳。常見的第三方庫有:
這些庫都提供了檔案分塊、斷點續傳、上傳進度等功能,可以讓你更快捷地實現大檔案上傳。
不過要注意的是,使用第三方庫可能會增加程式碼的複雜性和對第三方庫的依賴。在選擇使用第三方庫時需要權衡其優缺點,並確保它滿足你的需求。
關於檔案上傳需要了解的知識點:
二、檔案下載
在 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);
});