youtube
*|.env
*|middlewares.js
|controllers
*|videoController.js
|views
*|videoDetail.pug
%npm install aws-sdk
%npm install multer-s3
AWS_KEY = "access key id"
AWS_PRIVATE_KEY ="secret access key"
import multerS3 from 'multer-s3';
import aws from 'aws-sdk';
const s3 = new aws.S3({
accessKeyId: process.env.AWS_KEY,
secretAccessKey: process.env.AWS_PRIVATE_KEY,
// 버킷 생성시 설정한 리전
region: "ap-northeast-2"
});
//const uploadVideo = multer({dest: 'uploads/videos/'});
const uploadVideo = multer({
storage: multerS3({
s3,
acl: "public-read",
bucket: '버킷명/video'
})
});
//const uploadAvatar = multer({dest: 'uploads/avatars/'});
const uploadAvatar = multer({
storage: multerS3({
s3,
acl: "public-read",
bucket: '버킷명/avatar'
})
});
export const uploadVideoMiddleware = uploadVideo.single('videoFile');
export const uploadAvatarMiddleware = uploadAvatar.single('avatar');
AWS S3를 사용하기 전에는 업로드 된 파일 위치가 req.file.path에 담겨있었는데요. AWS처럼 외부 서버에 업로드하게 되면 multer가 파일 위치를 req.file.location에 담게 됩니다. 따라서 관련한 코드를 수정해주겠습니다.
export const postUpload = async (req, res) => {
const {
body:{
title,
description
},
file:{
location
}
} = req;
const newVideo = await Video.create({
fileUrl: location,
title,
description,
creator: req.user.id
});
// 생략
}
// avatar 수정 부분은 동일한 내용이므로 생략
기존에는 클라우드가 아니라 프로젝트 폴더에서 받아오는 것이어서 fileUrl에 /
를 붙여줬었는데요. 이제는 AWS S3에서 받아올 것이므로 videoDetail 뿐만 아니라 다른 탬플릿에서도 필요한 부분은 아래와 같이 수정해주면 됩니다.
extends layouts/main
include mixins/videoPlayercomment
block content
.video__container
+videoPlayer({
src: video.fileUrl
})