在網絡應用程序中,上傳文件並在後端進行處理是最常見的文件處理功能之一。例如,上傳頭像或附件。
假設我們有一個HTML文件輸入元素:
<input type="file" id="fileUpload" />
我們在#fileUpload
DOM元素上註冊一個變化事件處理程序,當用戶選擇一個圖像時,我們會觸發handleImageUpload()
函數並傳入所選文件。
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模塊:
npm install express-fileupload
在中間件中使用它:
import fileupload from 'express-fileupload'
//或
const fileupload = require('express-fileupload')
在創建Express應用程序之後,添加以下代碼:
app.use(
fileupload(),
//...
這是必需的,否則服務器無法解析文件上傳。
現在上傳的文件可以在req.files
中找到。如果忘記添加此中間件,req.files
將為undefined
。
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
函數中對其進行預處理,像這樣:
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
}
//...
}