안녕하세요! 강의 잘 듣고 있습니다.
저번의 질문 해결해주신 것 감사합니다!
진행 도중 또 질문이 생겨 올립니다 ㅠㅠ
파일 저장을 위한 storage 설정을 한 후에 그 설정 정보를 변수에 다음과 같이 담고서,
/ STORAGE MULTER CONFIG
let storage = multer.diskStorage({
// 클라이언트로 전달 받은 파일을 서버의 어느 곳에 저장할지 설정하는 부분이다.
// node server 폴더 구조에 맞춰서 uploads라는 폴더를 생성해 주자!
destination: (req, file, cb) => {
cb(null, "uploads/");
},
// 저장되는 파일 이름을 지정하는 부분이다.
filename: (req, file, cb) => {
cb(null, `${Date.now()}_${file.originalname}`);
}
});
// 파일 저장 방식에 대해 설정한 정보를 upload란 변수에 담는다. 파일은 하나만 핸들링한다.
const upload = multer({
storage: storage
}).single("file");
그 후에 upload 변수를 이용해 router 처리 시에 클라이언트로부터 온 파일을 핸들링 하는데요, 다음의 차이가 있습니다.
router.post('/uploadfiles', (req, res) => {
// 찍히지 않는다
console.log("req.file : ", req.file);
// 클라이언트에서 받은 비디오 파일을 노드 서버에 저장한다.
// 이를 위해 multer라는 dependency를 다운받는다.
upload(req, res, (err) => {
// 파일 필터링
let typeArray = req.file.filename.split('.');
let fileType = typeArray[1];
// 확장자가 동영상이 아니라면
if(fileType !== 'mp4' && fileType !== 'avi') {
return res.json({success: false, err});
}
// 잘 찍힌다.
console.log("req.file : ", req.file);
if(err) {
return res.json({success: false, err});
}
return res.json({
success: true,
url: req.file.path,
fileName: req.file.filename
});
})
});
upload 내에서만 req.file이 찍히는데요, 클라이언트 요청에서의 코드는 formData에 'file'이란 key로 다음과 같이 보내줍니다.
const onDrop = (files) => {
let formData = new FormData;
formData.append('file', files[0]);
const config = {
header: {'content-type': 'multipart/form-data'}
};
axios.post('/api/video/uploadfiles', formData, config)
.then(response => {
if(response.data.success) {
console.log(response.data);
} else {
alert('비디오 업로드를 실패했습니다.');
}
})
.catch(error => {
console.log(error)
});
};
도대체 왜 이런 현상이 발생하며, 무슨 차이가 있는 것일까요...?