node.js에서 이미지(파일, multipart/from-data
)를 올리기 위한 모듈이다.
npm install multer
로 모듈을 설치해준다.const multer = require('multer');
const upload = multer({
storage: multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './upload/');
},
filename: function (req, file, cb) {
cb(null, Date.now() + "-" + file.originalname);
}
})
});
destination
: 어느 폴더에 저장할지 지정filename
: 폴더 안에 저장되는 파일명 결정에 사용app.post('endpoint', upload.single('photo'), async (req, res) => {
// 어떤 동작
console.log(req.file);
});
req.file
에 파일 정보가 들어오게 된다.upload.single()
외에도, upload.array()
, upload.fields()
여러 사용법이 있다.req.files
에 파일 정보가 저장된다.upload.array('photo', 12)
: 12개의 파일 정보를 배열로 갖고 있는다.upload.fields([{ name: 'photo', maxCount: 1}, { name: 'photo2', maxCount: 2}])
:사용법은 위와 동일하고 storage만 s3 bucket으로 변경해서 사용하면 된다.
npm install aws-sdk
로 모듈 설치const aws = require('aws-sdk');
const s3 = new aws.S3({
accessKeyId: aws_key.access,
secretAccessKey: aws_key.secret,
region: aws_key.region
});
multer-s3
모듈을 사용해 storage 객체를 생성한다.npm install multer-s3
const multer = require('multer');
const multer_s3 = require('multer-s3');
const storage = multer_s3({
s3: s3,
bucket: '-', // 자신의 s3 버킷 이름
contentType: multer_s3.AUTO_CONTENT_TYPE,
acl: 'public-read', // 버킷에서 acl 관련 설정을 풀어줘야 사용할 수 있다.
metadata: function(req, file, cb) {
cb(null, {fieldName: file.fieldname});
},
key: function (req, file, cb) {
cb(null, `contents/${Date.now()}_${file.originalname}`);
}
})
const upload = multer({
storage: storage // storage를 multer_s3 객체로 지정
})
The bucket does not allow ACLs
였는데, bucket에 acl 관련 설정을 주지 않아 발생한 오류였다.여기까지 하면 연결 완료, 이제 라우터만 제대로 설정하면 잘 올라갈 것이다.
const express = require('express');
const app = express();
const upload = upload.fields([{name: 'photo', maxCount: 1}, {name: 'thumbnail', maxCount: 1}])
app.post('/', upload, async (req, res) => {
const photo = req.files['photo'][0];
cosnt thumbnail = req.files['thumbnail'][0];
console.log(photo, thumbnail);
});
app.listen(5000);
이런 식으로 간단하게 코드를 짜고 postman으로 테스트를 해보면, s3 bucket에 데이터가 제대로 들어간 것을 확인할 수 있다.