如何使用JavaScript將文件上傳到服務器
在網絡應用程序中,上傳文件並在後端進行處理是最常見的文件處理功能之一。例如,上傳頭像或附件。
假設我們有一個HTML文件輸入元素:
1
| <input type="file" id="fileUpload" />
|
我們在#fileUpload
DOM元素上註冊一個變化事件處理程序,當用戶選擇一個圖像時,我們會觸發handleImageUpload()
函數並傳入所選文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const handleImageUpload = event => { const files = event.target.files const formData = new FormData() formData.append('myFile', files[0])
fetch('/saveImage', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { console.log(data.path) }) .catch(error => { console.error(error) }) }
document.querySelector('#fileUpload').addEventListener('change', event => { handleImageUpload(event) })
|
我們使用Fetch API將文件發送到服務器。當服務器成功返回時,它將在path
屬性中發送圖像路徑給我們。
有了這一點,我們可以進行需要的操作,比如用圖像更新界面。
使用Node.js處理文件上傳的服務器端處理
下面是服務器端代碼的詳細說明。我們使用Node.js和Express框架來處理請求。
安裝express-fileupload
npm模塊:
1
| npm install express-fileupload
|
在中間件中使用它:
1 2 3
| import fileupload from 'express-fileupload' //或 const fileupload = require('express-fileupload')
|
在創建Express應用程序之後,添加以下代碼:
1 2 3
| app.use( fileupload(), //...
|
這是必需的,否則服務器無法解析文件上傳。
現在上傳的文件可以在req.files
中找到。如果忘記添加此中間件,req.files
將為undefined
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| app.post('/saveImage', (req, res) => { const fileName = req.files.myFile.name const path = \_\_dirname + '/images/' + fileName
image.mv(path, (error) => { if (error) { console.error(error) res.writeHead(500, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ status: 'error', message: error })) return }
res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ status: 'success', path: '/img/houses/' + fileName })) }) })
|
這是處理文件所需的最少代碼。我們調用上傳圖像的mv
屬性。這是由express-fileupload
模塊提供給我們的。我們將其移動到path
,然後將成功(或錯誤!)的信息傳遞回客戶端。
檢查客戶端上傳文件的屬性
如果您需要檢查文件類型或文件大小,可以在handleImageUpload
函數中對其進行預處理,像這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const handleImageUpload = event => { const files = event.target.files const myImage = files[0] const imageType = /image.\*/
if (!myImage.type.match(imageType)) { alert('抱歉,只允許上傳圖像文件') return }
if (myImage.size > (100\*1024)) { alert('抱歉,圖像文件的最大允許大小為100KB') return }
}
|
tags: [“file upload”, “JavaScript”, “Node.js”, “Express.js”]