코드

// Express 기본 모듈 불러오기

var express = require('express')

, http = require('http')

, path = require('path');

 

// Express의 미들웨어 불러오기

var bodyParser = require('body-parser')

, cookieParser = require('cookie-parser')

, static = require('serve-static')

, errorHandler = require('errorhandler');

 

// 에러 핸들러 모듈 사용

var expressErrorHandler = require('express-error-handler');

 

// Session 미들웨어 불러오기

var expressSession = require('express-session');

 

// 파일 업로드용 미들웨어

var multer = require('multer');

var fs = require('fs');

 

//클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원

var cors = require('cors');

 

// mime 모듈

var mime = require('mime');



// 익스프레스 객체 생성

var app = express();

 

// 기본 속성 설정

app.set('port', process.env.PORT || 3000);

 

// body-parser를 이용해 application/x-www-form-urlencoded 파싱

app.use(bodyParser.urlencoded({ extended: false }))

 

// body-parser를 이용해 application/json 파싱

app.use(bodyParser.json())

 

// public 폴더와 uploads 폴더 오픈

app.use('/public', static(path.join(__dirname, 'public')));

app.use('/uploads', static(path.join(__dirname, 'uploads')));

 

// cookie-parser 설정

app.use(cookieParser());

 

// 세션 설정

app.use(expressSession({

    secret:'my key',

    resave:true,

    saveUninitialized:true

}));



//클라이언트에서 ajax로 요청 시 CORS(다중 서버 접속) 지원

app.use(cors());



//multer 미들웨어 사용 : 미들웨어 사용 순서 중요 body-parser -> multer -> router

// 파일 제한 : 10개, 1G

var storage = multer.diskStorage({

destination: function (req, file, callback) {

callback(null, 'uploads')

},

filename: function (req, file, callback) {

callback(null, file.originalname + Date.now())

}

});

 

var upload = multer({

storage: storage,

limits: {

        files: 10,

        fileSize: 1024 * 1024 * 1024

    }

});



// 라우터 사용하여 라우팅 함수 등록

var router = express.Router();



//파일 다운로드 패스에 대한 라우팅

router.route('/process/download').get(function(req, res) {

    console.log('/process/download 호출됨.');

    

    try {

        var paramFilepath = req.param('filepath');

        var filepath = __dirname + paramFilepath;

        var filename = path.basename(paramFilepath);

var mimetype = mime.lookup(paramFilepath);

        

        console.log('파일 패스 : ' + filepath);

        console.log('파일 이름 : ' + filename);

        console.log('MIME 타입 : ' + mimetype);

        

        // 파일 크기 확인

        var stats = fs.statSync(filepath);

        var fileSize = stats["size"];

        console.log('파일 크기 : ' + fileSize);

        

        // 클라이언트에 응답 전송

        res.setHeader('Content-disposition', 'attachment; filename=' + filename);

     res.setHeader('Content-type', mimetype);

     res.setHeader('Content-Length', fileSize);

    

     var filestream = fs.createReadStream(filepath);

     filestream.pipe(res);

    

    } catch(err) {

        console.dir(err.stack);

        

        res.writeHead('400', {'Content-Type':'text/html;charset=utf8'});

        res.write('<h3>파일 다운로드 실패</h3>');

        res.end();

    }   

        

});




// 파일 업로드 라우팅 함수 - 로그인 후 세션 저장함

router.route('/process/photo').post(upload.array('photo', 1), function(req, res) {

    console.log('/process/photo 호출됨.');

    

    try {

        var files = req.files;

    

console.dir('#===== 업로드된 첫번째 파일 정보 =====#')

console.dir(req.files[0]);

console.dir('#=====#')

 

        // 현재의 파일 정보를 저장할 변수 선언

        var originalname = '',

            filename = '',

            mimetype = '',

            size = 0;

        

        if (Array.isArray(files)) { // 배열에 들어가 있는 경우 (설정에서 1개의 파일도 배열에 넣게 했음)

     console.log("배열에 들어있는 파일 갯수 : %d", files.length);

    

     for (var index = 0; index < files.length; index++) {

         originalname = files[index].originalname;

         filename = files[index].filename;

         mimetype = files[index].mimetype;

         size = files[index].size;

     }

    

     } else { // 배열에 들어가 있지 않은 경우 (현재 설정에서는 해당 없음)

     console.log("파일 갯수 : 1 ");

    

         originalname = files[index].originalname;

         filename = files[index].name;

         mimetype = files[index].mimetype;

         size = files[index].size;

     }

        

        console.log('현재 파일 정보 : ' + originalname + ', ' + filename + ', '

                + mimetype + ', ' + size);

        

        // 클라이언트에 응답 전송

        res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});

        res.write('<h3>파일 업로드 성공</h3>');

        res.write('<hr/>');

        res.write('<p>원본 파일명 : ' + originalname + ' -> 저장 파일명 : ' + filename + '</p>');

        res.write('<p>MIME TYPE : ' + mimetype + '</p>');

        res.write('<p>파일 크기 : ' + size + '</p>');

        res.end();

        

    } catch(err) {

        console.dir(err.stack);

    }   

        

});

 

app.use('/', router);



// 404 에러 페이지 처리

var errorHandler = expressErrorHandler({

static: {

'404': './public/404.html'

}

});

 

app.use( expressErrorHandler.httpError(404) );

app.use( errorHandler );



// Express 서버 시작

var server = http.createServer(app).listen(app.get('port'), function(){

console.log('Express server listening on %s, %s', server.address().address, server.address().port);

});

로그

Express server listening on ::, 3000
/process/download 호출됨.
express deprecated req.param(name): Use req.params, req.body, or req.query instead app14.js:101:27
파일 패스 : C:\Users\nullc\Downloads\ExpressExample/downloads/house.png
파일 이름 : house.png
MIME 타입 : image/png
파일 크기 : 16833

 

설명 

 

아래 URL 호출 시 파일을 서버에서 다운로드하는 것이다.

http://localhost:3000/process/download?filepath=/downloads/house.png

 

파일 다운로드에 대한 라우터로 이러한 기능을 실행하는 것인데

특정 폴더에 있는 파일을 다운로드에 로컬에 저장할 수 있도록 해준다.

클라이언트에 대한 응답으로 파일을 전송한다.

'IT > Node JS' 카테고리의 다른 글

Node.js 파일 업로드 사용하기  (0) 2019.06.05
Node.js 세션 사용하기  (0) 2019.06.05
Node.js 쿠키 사용하기  (0) 2019.06.05
Node.js 에러 처리하기  (0) 2019.06.05
Node.js params 객체 사용하기  (0) 2019.06.05

+ Recent posts