728x90
반응형
전 포스트에서 클라이언트에서 백엔드에 데이터를 전송하는 것 까지 구현해보았다.
이번 포스트에서는 백엔드에서 s3에 접근하여 파일을 업로드 하는 것까지 구현해보겠다.
1. .env 파일을 만들어준다. ( 전에 버킷 생성할 때 key ID 와 secret key 필요 )
S3_ACCESS_KEY='액세스 키'
S3_SECRET_ACCESS_KEY='비밀 액세스 키'
S3_REGION='리전'
S3_BUCKET_NAME='버킷이름'
2. 서버 파일에 필요한 것들을 선언하고 라우터를 만들어준다. ( 서버 파일에 body-parser 필요 )
file.js
const multer = require('multer');
const aws = require('aws-sdk');
require('dotenv').config();
const s3 = new aws.S3({
accessKeyId: process.env.S3_ACCESS_KEY,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: process.env.S3_REGION,
});
let upload = multer({
limits: { fileSize: 5 * 1024 * 1024 } // 용량 제한
});
router.post("/upload", upload.array("file_object"), function (req, res, next) {
try {
var base64data = new Buffer(req.files[0].buffer, 'binary');
const params = {
Bucket: process.env.S3_BUCKET_NAME,
Key: 'sample.png', // file name that you want to save in s3 bucket
Body: base64data,
ACL: "public-read",
ContentType: "image/png"
}
s3.upload(params, (err, data) => {
if (err) {
console.log("err : ", err)
res.send({ success: false });
}
else {
console.log("data : ", data)
res.send({ success: true, result: data })
}
});
}
catch (ERR) {
console.log("ERR : ", ERR)
res.send({ success: false })
}
});
module.exports = router;
params의 key 부분에서 원하는 파일의 이름과 경로를 지정해줄 수 있다.
추가로 데이터베이스에 파일에 관한 내용을 추가하여 나중에 불러올 때 편하도록 설계하였다.
s3.upload(params, (err, data) => {
if (err) {
console.log("err : ", err)
res.send({ success: false });
}
else {
File.findOne(
{
where: {
file_customer_code: customer_code,
}
}).then((result) => {
if (result) {
File.update({
file_url: req.body.file_url,
file_location: key
}, {
where: {
file_customer_code: customer_code,
}
})
.then((result) => {
res.send({ success: true, result: data })
})
}
else {
File.create({
file_customer_code: customer_code,
file_url: req.body.file_url,
file_location: key
})
.then((result) => {
res.send({ success: true, result: data })
})
}
})
}
});
나중에 파일이 존재하는지 확인할 때 데이터베이스 먼저 확인하고 파일에 접근할 수 있도록 했다.
- fileState, fileDispatch 설정
- input을 만들고 파일 선택 후 state에 담기도록 함.
- 담긴 데이터들을 formData로 만들어서 백엔드에 전송
- 백엔드에서 해당 파일을 s3에 저장함.
- 데이터베이스에 저장된 파일에 대한 내용 (경로 , 고유 키값 등)을 저장함
@@ 참고로 파일을 삭제하는 메소드는 deleteObject 이다.
ex)
s3.deleteObject({ Bucket: process.env.S3_BUCKET_NAME, Key: result.file_location }, (err, data) => {
if (err) {
console.log("err : ", err)
}
})
728x90
반응형
'Back-End > Node.js' 카테고리의 다른 글
Node.js | Multer 를 이용한 AWS S3 파일 업로드 구현(4) | React(Next.js) url image download (0) | 2022.04.27 |
---|---|
Node.js | Multer 를 이용한 AWS S3 파일 업로드 구현(3) (0) | 2022.04.27 |
Node.js | Multer 를 이용한 AWS S3 파일 업로드 구현(1) (2) | 2022.04.26 |
Node.js | Multer 설치 및 기본 메소드 (0) | 2022.04.26 |
Node.js | 웹, 웹앱에서 핸드폰 기능 (ex 전화걸기, 문자보내기) (0) | 2022.04.25 |