文件上傳功能在nodejs初期是一件很難實現的功能,之后出現了formidable勉強能解決這個問題,但是express框架出現之后基於這個框架開發的中間件有更好的方法來處理文件上傳,這個中間件就是multer,multer中間件的github地址是https://github.com/expressjs/multer,中文api閱讀起來很方便,有興趣的同學可以去看一下,
var express=require("express")
var app=express()
var multer=require("multer")
var upload=multer({ dest: 'uploads/' })
var fs=require("fs")
app.use(upload.fields([{ name: 'file1', maxCount: 1 }]))
app.get("/upload",function(req,res){
var html=fs.readFileSync("./upload.html")
res.end(html)
})
app.post("/upload",function(req,res){
if(req.files){
res.end("上傳成功")
}else{
res.end("上傳錯誤")
}
console.log("上傳文件信息如下:")
console.log(req.files)
})
app.listen(80)
其中文件upload.html代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<p>選擇需要上傳的文件:<input type="file" name="file1" value="點擊選擇上傳文件"></p>
<input type="submit" value="提交">
</form>
</body>
</html>
需要注意的點有:
1.form必須加上屬性enctype值為multipart/form-data
2.input(type=“file”)的屬性name的值必須和upload.fields函數傳入對象的屬性name值一樣
如何需要上傳兩個文件可以這樣寫:
app.use(upload.fields([{ name: 'file1', maxCount: 1 },{name:'file2',maxCount:1}]))
與之對應的form表單這樣寫:
<input type="file" name="file1" />
<input type="file" name="file2" />
3個或者4個或者更多文件如此類推,關於req.fiels里面的對象屬性值所代表的意思大家可以去參考github上關於multer的介紹。
最后附上packjson文件:
{
"name": "nodejs-express-upload",
"version": "1.0.0",
"description": "",
"main": "app.js",
"dependencies": {
"express": "^4.14.1",
"multer": "^1.3.0"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}