파일 업로드를 위해 multipart/form-data
를 다루기 위한 미들웨어
multipart가 아닌 폼에서는 동작하지 않음
npm install multer --save
const multer= require('multer')
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads/")
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}_${file.originalname}`)
},
fileFilter:(req,file,cb)=>{
const ext=path.extname(file.originalname)
if(ext!=='.png' || ext!=='.jpg'){
return cb(res.status(400).end('only png or jpg are allowed'),false);
}
cb(null,true)
}
})
const upload = multer({ storage: storage }).single("file_name")
router.post("/uploadImage", (req, res) => {
upload(req, res, (err) => {
if (err) {
return res.status(400).json({ success: false, err })
}
return res.status(200).json({
success: true,
image: res.req.file.path,
fileName: res.req.file.filename
})
})
})
Key | Description | Note |
---|---|---|
fieldname | 폼에 정의된 필드 명 | |
originalname | 사용자가 업로드한 파일 명 | |
encoding | 파일의 엔코딩 타입 | |
mimetype | 파일의 Mime 타입 | |
size | 파일의 바이트(byte) 사이즈 | |
destination | 파일이 저장된 폴더 | DiskStorage |
filename | destination 에 저장된 파일 명 | DiskStorage |
path | 업로드된 파일의 전체 경로 | DiskStorage |
buffer | 전체 파일의 Buffer | MemoryStorage |
multer(opts)
Key | Description |
---|---|
dest or storage | 파일이 저장될 위치 |
fileFilter | 어떤 파일을 허용할지 제어하는 함수 |
limits | 업로드 된 데이터의 한도 |
preservePath | 파일의 base name 대신 보존할 파일의 전체 경로 |
var upload = multer({ dest: 'uploads/' }) //uploads 폴더에 저장
fieldname
인자에 명시된 이름의 파일 전부를 배열 형태로 전달 받음fields
인자에 명시된 여러 파일을 전달 받음Storage
DiskStorage: 디스크 스토리지 엔진은 파일을 디스크에 저장하기 위한 모든 제어 기능을 제공
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '/uploads')
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now())
}
})
var upload = multer({ storage: storage })
MemoryStorage: 메모리 스토리지 엔진은 파일을 메모리에 Buffer
객체로 저장
var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
limits
다음의 선택적 속성의 크기 제한을 지정하는 객체
속성 | 설명 | 기본값 |
---|---|---|
fieldNameSize | 필드명 사이즈 최대값 | 100 bytes |
fieldSize | 필드값 사이즈 최대값 | 1MB |
fields | 파일형식이 아닌 필드의 최대 개수 | 무제한 |
fileSize | multipart 형식 폼에서 최대 파일 사이즈(bytes) | 무제한 |
files | multipart 형식 폼에서 파일 필드의 최대 개수 | 무제한 |
parts | For multipart forms, the max number of parts (fields + files) | 무제한 |
headerPairs | multipart 형식 폼에서 파싱할 헤더의 key=>value 쌍의 최대 개수 | 2000 |
const upload = multer({ storage:storage, limits: { files: 10, fileSize: 1024 * 1024 * 1024, } });
app,use('/uploads', express.static('/uploads'));
/uploads url 요청을 통해 uploads 디렉토리에 있는 파일을 요청할 수 있음
ex) http://localhost:5000/uploads/userImage.jpg