Nodejs實現(xiàn)文件上傳的示例代碼
筆者用nodejs做項目時需要用到文件上傳的功能,在網(wǎng)上搜索了很多教程,找到了一個express的中間件,用于處理 multipart/form-data 類型的表單數(shù)據(jù),可以很方便的將表單中的文件數(shù)據(jù)保存到服務(wù)器。
介紹
簡單的用法
定義存儲器
Multer作為express的一個中間件,我們可以很方便的自定義上傳的文件目錄以及保存的文件名。先看一個最簡單的用法, demo1地址 :
var express = require('express');
var multer = require('multer');
var app = express();
var upload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb){
cb(null, './uploads/');
},
filename: function (req, file, cb){
//file.originalname上傳文件的原始文件名
var changedName = (new Date().getTime())+'-'+file.originalname;
cb(null, changedName);
}
})
});
我們先創(chuàng)建了一個upload對象,這個對象中destination函數(shù)用來定義上傳文件的存儲的文件夾;filename函數(shù)用來修改上傳文件存儲到服務(wù)器的文件名稱,這里我們我們加上一個時間戳簡單區(qū)分一下。這兩個函數(shù)都是通過回調(diào)函數(shù)來實現(xiàn)的。每次上傳的時候這兩個函數(shù)都會調(diào)用一次,如果是多個文件上傳,那個這兩個函數(shù)就調(diào)用多次,調(diào)用順序是先調(diào)用destination,然后調(diào)用filename。
在兩個函數(shù)中都會有一個 file 對象,表示當(dāng)前上傳的文件對象,有以下幾個屬性:
- fieldname:上傳的字段名
- originalname:上傳的文件名
- encoding:文件的編碼類型
- mimetype:文件的MIME類型
定義路由回調(diào)
//單個文件上傳
app.post('/upload/single',upload.single('singleFile'),(req,res)=>{
console.log(req.file);
res.json({
code: '0000',
type:'single',
originalname: req.file.originalname
})
});
//多個文件上傳
app.post('/upload/multer',upload.array('multerFile'),(req,res)=>{
console.log(req.files);
let fileList = [];
req.files.map((elem)=>{
fileList.push({
originalname: elem.originalname
})
});
res.json({
code: '0000',
type:'multer',
fileList:fileList
});
});
在express中定義路由的回調(diào)函數(shù)時,把定義好了的upload對象作為中間件添加進去。如果是單個文件就用 single 方法,如果是多個文件就用 array 方法,這兩個方法都需要傳一個頁面上定義好的字段名。
在路由的回調(diào)函數(shù)中,request對象已經(jīng)有了file屬性(單個文件上傳)或files屬性(多個文件上傳),files屬性是一個數(shù)組,數(shù)組的每一個對象都有以下屬性:
- fieldname:上傳的字段名
- originalname:上傳的文件名
- encoding:文件的編碼類型
- mimetype:文件的MIME類型
- destination:存儲的目錄(和destination回調(diào)函數(shù)中的目錄名一致)
- filename:保存的文件名(和filename回調(diào)函數(shù)中的文件名一致)
- path:保存的相對路徑
- size:文件的大?。▎挝唬鹤止?jié)byte)
我們可以發(fā)現(xiàn)在路由的回調(diào)函數(shù)中的file對象比diskStorage中的file對象多了幾個屬性,這是因為在diskStorage中文件還沒有保存,只能知道文件的大致屬性;而路由的回調(diào)函數(shù)文件已經(jīng)在服務(wù)器上保存好了,文件的保存路徑以及文件的大小都是已知的。
過濾文件上傳
在文件上傳時,有時候會上傳一些我們不需要的文件類型,我們需要把一些不需要的文件給過濾掉。demo2地址 。
文件類型過濾
var upload = multer({
//...其他代碼
fileFilter: function(req, file, cb){
if(file.mimetype == 'image/png'){
cb(null, true)
} else {
cb(null, false)
}
}
});
在定義存儲器的時候,新增一個fileFilter函數(shù),用來過濾掉我們不需要的文件,在回調(diào)函數(shù)中我們傳入true/false來代表是否要保存;如果傳了false,那么destination函數(shù)和filename函數(shù)也不會調(diào)用了。
文件大小和數(shù)量過濾
var upload = multer({
//...其他代碼
limits:{
//限制文件大小10kb
fileSize: 10*1000,
//限制文件數(shù)量
files: 5
}
});
在定義存儲器的時候,新增一個limits對象,用來控制上傳的一些信息,它有以下一些屬性:
- fieldNameSize:field 名字最大長度,默認(rèn)值:100 bytes
- fieldSize:field 值的最大長度,默認(rèn)值:1MB
- fields:非文件 field 的最大數(shù)量
- fileSize:在multipart表單中, 文件最大長度 (字節(jié)單位)
- files:在multipart表單中, 文件最大數(shù)量
- parts:在multipart表單中, part傳輸?shù)淖畲髷?shù)量(fields + files)
在這邊我們把fileSize的值設(shè)置得小一點,設(shè)為10kb方便測試看效果,但是如果這個時候會發(fā)現(xiàn)有報錯。因為上傳的文件大小很容易就會超過10KB,導(dǎo)致有報錯出現(xiàn),我們就需要在路由回調(diào)里對錯誤的情況進行捕獲。
//單個文件上傳
let singleUpload = upload.single('singleFile');
app.post('/upload/single',(req,res)=>{
singleUpload(req,res,(err)=>{
if(!!err){
console.log(err.message)
res.json({
code: '2000',
type:'single',
originalname: '',
msg: err.message
})
return;
}
if(!!req.file){
res.json({
code: '0000',
type:'single',
originalname: req.file.originalname,
msg: ''
})
} else {
res.json({
code: '1000',
type:'single',
originalname: '',
msg: ''
})
}
});
});
//多個文件上傳
let multerUpload = upload.array('multerFile');
app.post('/upload/multer', (req,res)=>{
multerUpload(req,res,(err)=>{
if(!!err){
res.json({
code: '2000',
type:'multer',
fileList:[],
msg: err.message
});
}
let fileList = [];
req.files.map((elem)=>{
fileList.push({
originalname: elem.originalname
})
});
res.json({
code: '0000',
type:'multer',
fileList:fileList,
msg:''
});
});
});
所有的demo代碼都在這個 倉庫里
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何自定義node版本,實現(xiàn)node多版本控制方式
這篇文章主要介紹了如何自定義node版本,實現(xiàn)node多版本控制方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
nodejs實現(xiàn)獲取本地文件夾下圖片信息功能示例
這篇文章主要介紹了nodejs實現(xiàn)獲取本地文件夾下圖片信息功能,涉及node.js針對文件、目錄的遍歷、讀取等相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
用Node.JS打造一個惡劣天氣實時預(yù)警系統(tǒng)
本文將從實戰(zhàn)的角度出發(fā),利用NodeJS以及聚合數(shù)據(jù)的第三方免費接口打造一個完整的天氣實時預(yù)警項目系統(tǒng),具有一定的參考價值,感興趣的可以了解一下2021-12-12
node.js+npm的環(huán)境配置以及添加鏡像(保姆級教程)
本文主要介紹了node.js+npm的環(huán)境配置以及添加鏡像,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
node實現(xiàn)將json轉(zhuǎn)為excel
平時我們寫代碼處理的數(shù)據(jù)格式一般都是json格式的數(shù)據(jù),但有時候我們也需要將數(shù)據(jù)轉(zhuǎn)為excel格式進行保存或分享,所以下面我們就來學(xué)習(xí)一下如何通過node實現(xiàn)json轉(zhuǎn)excel吧2024-11-11
nodejs基于mssql模塊連接sqlserver數(shù)據(jù)庫的簡單封裝操作示例
這篇文章主要介紹了nodejs基于mssql模塊連接sqlserver數(shù)據(jù)庫的簡單封裝操作,結(jié)合實例形式分析了nodejs中mssql模塊的安裝與操作sqlserver數(shù)據(jù)庫相關(guān)使用技巧,需要的朋友可以參考下2018-01-01

