使用者在網頁選取檔案(如圖片)後,點擊確定按鈕,希望透過 AJAX 非同步將檔案傳送至後端,並轉為 byte 陣列處理,類似論壇發文上傳圖片的功能。
早期瀏覽器安全機制下,JavaScript 無法直接取得本機檔案完整路徑,只能取得檔名。若使用傳統 <form> 提交,頁面會重新整理,體驗不佳。
HTML5 引入 FormData 介面,可輕鬆構建鍵值對資料,包含檔案二進位內容,配合 XMLHttpRequest 或 fetch 即可非同步上傳。
<input type="file" id="fileInput" accept="image/*" />
<button id="uploadBtn">上傳</button>
<script>
document.getElementById('uploadBtn').addEventListener('click', async () => {
const file = document.getElementById('fileInput').files[0];
if (!file) return alert('請先選擇檔案');
const formData = new FormData();
formData.append('file', file); // key 需與後端對應
try {
const response = await fetch('/api/upload', {
method: 'POST',
body: formData
// 不需設定 Content-Type,瀏覽器會自動帶入 multipart/form-data 及 boundary
});
const result = await response.json();
console.log('上傳成功', result);
} catch (err) {
console.error('上傳失敗', err);
}
});
</script>
IFormFile file = Request.Form.Files["file"]; 讀取 file.OpenReadStream() 取得串流,或 file.CopyToAsync(memoryStream) 轉 byte[]。@RequestParam("file") MultipartFile file 取得 file.getBytes()。req.file.buffer 直接為 Buffer。XMLHttpRequest.upload.onprogress 監聽進度事件。input multiple 並迴圈 formData.append('files', file)。採用 FormData + fetch 是現代 Web 應用上傳檔案的標準做法,體驗流暢且相容性佳(IE10+ 皆支援)。