Express 에서 파일 업로드를 사용하기 위해서는 “multer” 라는 모듈을 추가로 설치해서 사용해야 한다. 이 multer는 파일 전송을 할때 사용하는 multipart/form-data 를 다루는 외장 모듈이다.


Cross Origin Resource Sharing(CORS) 모듈 설정

cors 는 Cross Origin Resource Sharing(cors) 상황에 대한 제한을 해제하기 위한 모듈이다.

여기서 cors 란 http://A.com 에서 요청한 페이지 내에 http://B.com 에 대한 리소스가 들어있는 경우이다. 이럴 경우 최소 두번 이상의 연속 요청이 일어나게 되는데, 브라우저는 기본적으로 보안 이슈로 인해 cors 를 제한하고 있다.

그러나 다수의 세션에 대해 원활한 파일 업로드가 이루어 지기 위해서는 이러한 cors 제한을 해제해야 한다.

npm install cors --save

먼저, 외장 모듈인 cors 를 설치한다.

// 빌트인(내장) 모듈 불러오기
// 익스프레스 객체 및 웹 서버 객체 생성
...
// Cross Origin Resource Sharing(cors) 제한 해제를 위한 모듈
var cors = require('cors');
// 포트 설정 및 요청 대기
...
 
// 미들웨어 설정
...
app.use(cors()); // cors 제한 

그 후 app.js(server.js) 에서 해당 모듈을 불러오고, 미들웨어로 설정하여 cors 제한을 해제할 수 있도록 한다.


업로드 뷰(View) 처리

<form action="/write" method="post" enctype="multipart/form-data">
    <input type="text" name="title" value="제목이들어간다" />
    <input type="text" name="content" value="내용이들어간다" />
    <input type="file" name="attachment" />
    <input type="submit" value="업로드" />
</form>

파일을 전송하기 위해 이 포함되어 있는 <form> 태그는 반드시 enctype=”multipart/form-data” 속성을 통해 데이터를 전송해야만 한다.


multer 모듈 설정 및 라우팅 처리

multer 모듈은 multipart/form-data 를 효율적으로 처리하기 위한 외장 모듈이다. 외장 모듈이므로 npm 을 통해 설치할 수 있도록 한다.

npm install multer --save

multer 모듈의 설치가 완료 되었다면, router.js 에서 해당 모듈을 불러오고, 업로드 요청이 온 파일에 대한 처리를 작성한다.

// multipart 모듈 불러오기
var multer = require('multer');
 
// 기본 세팅
var storage = multer.diskStorage({
    destination: function(req, file, callback){
        callback(null, 'uploads')
    },
    filename: function(req, file, callback){
        callback(null, file.originalname)
    }
});
 
var upload = multer({
    storage: storage,
    limits: {
        files: 10,
        fileSize: 10 * 1024 * 1024 * 1024
    }
});
 
// 파일 업로드
router.route('/write')
    .get(upload.single('attachment'), function(req, res){
        attachment = req.file;
        title = req.body.title;
        content = req.body.content;
 
        console.log("제목 : " + title);
        console.log("내용 : " + content);
 
        if(attachment != null){
            console.log('첨부파일 정보...');
            console.dir(attachment);
        }
        
    });

multer 객체는 저장될 파일의 경로, 파일명, 파일 수, 파일 사이즈 등을 설정하고 제한하는 내용을 포함하고 있다.

limits 는 업로드 제한에 대한 설정을 정의하고 있는데, 파일 수와 파일 사이즈에 대한 제한을 두고 있다. storage 는 저장 경로, 저장 파일명 등을 정의하며, 객체 코드의 양이 많아서 인라인 객체가 아닌 별개의 객체로 선언해서 사용하고 있다.(5행)

라우터 설정에 파일 업로드에 대한 최종 처리가 진행된다. (23~37행) 라우터 함수에 다수의 콜백 함수를 입력하면, 첫 번째 인자의 함수부터 순차적으로 실행된다.

multer 객체가 담겨있는 upload 객체는 파일 업로드에 대한 두 가지 메소드를 지원한다.

메소드명 특징
.single(‘attachment’) 한 개의 파일만 업로드
.files(‘attachment’) 다수의 파일을 업로드

업로드 후의 Response 콜백 함수에서 파일에 대한 접근은 req.file 로 가능하다.

필드명 설명 예시
(req.file).fieldname 파일 정보를 담고 있는 객체명 req.file
originalname 원본 파일명 happy.jpg
encoding 인코딩 타입 7bit
mimetype 확장자 타입 image/jpeg
destination 저장 경로 uploads
filename 저장된 파일명 happy.jpg
path 파일 경로 uploads/happy.jpg
size 파일 크기(Byte) 37183(Byte)