express
는 자체적으로 사용자가 업로드한 파일을 받아서, 디렉토리에 저장하는 기능을 가지고 있지 않다. ⇒ 모듈을 설치해서, 해당 모듈로 파일을 저장한다.Multer
: 사용자가 전송한 파일을 어딘가에 저장하는데 사용되는 모듈const upload = multer({ dest : 'uploads/'})
// 2번째 인자인 upload.single은 미들웨어이고, 3번째 인자인 콜백함수가 실행되기전에 미들웨어가 먼저 실행된다.
app.post('/profile', upload.single('avatar'), (req, res) => {
})
uploads
라는 디렉토리에 사진을 저장 하겠다!upload.single('avatar')
은 미들웨어이고, 3번째 인자인 콜백함수가 실행되기전에 미들웨어가 먼저 실행된다.
upload.single('avatar')
역할 : 사용자가 전송한 데이터에서, 만약에 파일이 포함되어있다면, 파일을 가공해서 req 객체에 file
이라는 프로퍼티를 암시적으로 추가해 준다.
req객체의 file
프로퍼티에 접근 할 수 있게 된다.
‘avatar’
의 필드에는 input의 name
어트리뷰트의 값을 입력하면 된다.
req.file
를 확인해보면, 사용자가 전송한 파일에 대한 정보를 알 수 있게 된다.
const _storage = multer.diskStorage({
destination : (req, file, cb) => {
cb(null, '/tmp/my-uploads')
}
filename : (req, file, cb) => {
cb(null, file.fieldname + '-' + Date.now())
}
})
// destination과 filename 함수를 실행시킬 것이다.
const upload = multer({ storage : _storage })
dest 대신에 storage
라는 프로퍼티도 쓸 수 있다.
diskStorage
메서드에, destination
과 filename
이라는 함수를 넘길 수가 있다.
destination
함수 : 사용자가 전송한 파일을 어느 디렉토리에 저장할 것인가?
filename
함수 : 그 디렉토리에 저장할 파일이름을 어떻게 할 것 인가?
destination
프로퍼티 심화 사용법
const _storage = multer.diskStorage({
destination : (req, file, cb) => {
if(파일의 형식이 이미지면?)
cb(null, '/tmp/my-uploads/images')
else if(파일이 형식이 텍스트면?)
cb(null, '/tmp/my-uploads/texts')
}
filename : (req, file, cb) => {
cb(null, file.fieldname + '-' + Date.now())
}
})
filename
프로퍼티 심화 사용법const _storage = multer.diskStorage({
destination : (req, file, cb) => {
cb(null, '/tmp/my-uploads/')
}
filename : (req, file, cb) => {
if(만약 이미 파일이 존재한다면?)
cb(null, file.fieldname 에 동일 이름의 파일 중에 가장 큰 숫자를 맨 끝에 붙인다.)
else
cb(null, file.fieldname)
}
})