멀터 미들웨어를 사용할 수 있습니다.
( 설치 : npm i multer )
이미지, 동영상 등을 비롯한 여러 가지 파일들을
이 형식으로 업로드 합니다.
enctype=multipart/form-data 인
폼을 통해 업로드하는 데이터의 형식을 의미합니다.
express.urlencoded({ extended: false })는
일반 폼만 파싱이 가능하고
멀티파트 형식은 파싱할 수 없습니다.
직접 파싱(해석)하는 것도 어렵습니다.
multer 는 이런 어려움을 해결해줍니다.
멀티파트 형식의 데이터를 파싱할 수 있습니다.
파싱한 데이터를 원하는 저장공간에
저장할 수 있도록 설정할 수 있습니다.
업로드 파일의 크기를 제한하는 설정을 할 수 있습니다.
요약 : 개발자 도구 > Network탭 > Headers탭에서 하단
이미지 하나를 선택 하고
title 인풋에 텍스트를 아무거나 적어서
업로드 버튼을 클릭하면
멀티파트 형식으로 폼 데이터가 전송됩니다.
어디서 확인할 수 있을까요?
폼 데이터는
개발자 도구 > Network탭 > Headers탭에서 하단
으로 가면 확인할 수 있습니다.
(아래 예시는 멀티파트폼이 아닌 일반폼 입니다.)
multer 함수의 인수로 설정을 넣습니다.
const upload = multer({ 여기에 설정 })
storage는
어디에 어떻게 저장할지 설정할 수 있는 속성 입니다.
어디에 저장하느냐에 따라
multer.diskStorage, multerS3 등의 함수를 이용할 수 있습니다.
서버에 존재하는 어떤 폴더에 파일을 저장할 때 사용합니다.
다음 두 함수를 이용해 설정합니다.
destination 함수로
어떤 폴더(존재하는 폴더여야 함)에 저장할지 설정 합니다.
filename 함수로
파일명을 수정해서 저장할 수도 있습니다.
(현재 날짜를 합쳐서 파일명을 수정한 이유 -> 파일명 중첩 방지)
destination과 filename 함수는
매개변수로 req, file, done를 가지고 있습니다.
req :
요청에 대한 정보가 있음
file :
객체이며 업로드한 파일에 대한 정보가 있음
done :
다음과 같이 사용되는 함수입니다.
done(인수1, 인수2)
인수1 : 에러가 있다면 에러를 넣습니다.
인수2 : 저장할 폴더명 or 수정할 파일 이름 을 넣어줍니다.
req나 file의 데이터를 가공해서
done으로 넘기는 형식으로 사용 됩니다.
multer.diskStorage 대신 multerS3 를 이용하면
AWS S3 버킷에 파일을 저장할 수 있습니다.
서버 자체에 파일을 저장하면 오토스케일링시
불필요하게 파일까지 복사되서
금전적 손실로 이어질 수 있습니다.
그래서 AWS의 S3 같은 서비스를 이용해
파일은 별도로 관리하는 것이 효율적일 수 있습니다.
다소 설정에 차이가 있으나 설정하는 사항은 비슷합니다.
limits 속성으로
업로드에 대한 제한 사항을 설정할 수 있습니다.
fileSize : 파일 사이즈를 바이트 단위로 설정해 제한할 수 있습니다.
multer.diskStorage 에서 설정한 저장 폴더는 반드시 존재해야 합니다.
아래와 같이
서버 실행시 해당 폴더가 존재하지 않는 경우
폴더를 생성하도록 설정할 수 있습니다.
fs.accessSync(‘uploads’) : uploads 폴더에 접근합니다.
fs.readdirSync(‘uploads’) : uploads 폴더를 조회합니다.
둘중 하나를 이용해 uploads 폴더가 있는지 확인하고(try)
없다면(catch)
fs.mkdirSync(‘uploads’) : uploads 폴더를 생성합니다.
single, array, fields, none 미들웨어가 있습니다.
array 미들웨어 사용예시 입니다.
single :
파일을 하나만 업로드하는 경우에 사용
업로드 성공시 업로드 결과 정보가 들어 있는
req.file 객체가 생성됨
array :
여러 파일을 업로드 하는 경우에 사용
업로드 성공시 req.files 배열이 생성됨
fields :
파일을 여러 개 업로드하지만
input 태그나 폼 데이터의 키가 다른 경우에 사용
업로드 성공시 req.files.키 로
업로드 결과 정보에 접근할 수 있음
none :
파일을 업로드하지 않고도 멀티파트 형식으로 업로드하는 경우에 사용
파일은 업로드 되지 않았으므로
req.body 에만 값이 존재함