◎멀티파트포맷 : 음악이나 이미지 파일 등을 일반 데이터와 함께 웹 서버로 보내려고 만든 표준
-multer 미들웨어 설치-
% npm install multer --save
속성/메소드 이름 | 설명 |
destination | 업로드한 파일이 저장될 폴더를 지정합니다. |
filename | 업로드한 파일의 이름을 바꿉니다. |
limits | 파일 크기나 파일 개수 등의 제한 속성을 설정하는 객체입니다. |
app13.js
/**
* 파일 업로드하기
*
* 웹브라우저에서 아래 주소의 페이지를 열고 웹페이지에서 요청
* http://localhost:3000/public/photo.html
*
* 파일업로드를 위해 클라이언트에서 지정한 이름은 photo 입니다.
*
* @date 2016-10-25
* @author Mike
*/
// 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');
// 익스프레스 객체 생성
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/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 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
photo.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일업로드 테스트</title>
</head>
<body>
<h1>파일업로드</h1>
<br>
<form method="post" enctype="multipart/form-data" action="/process/photo">
<table>
<tr>
<td><label>파일</label></td>
<td><input type="file" name="photo" /></td>
</tr>
</table>
<input type="submit" value="업로드" name="submit"/>
</form>
</body>
</html>
'For developer > Node.js' 카테고리의 다른 글
(Node.js)기록용 -> 경로설정 (0) | 2020.09.10 |
---|---|
(Node.js)모듈화 (0) | 2020.09.09 |
(Node.js)쿠키와 세션 (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(2) (0) | 2020.09.08 |
(Node.js)익스프레스로 웹 서버 만들기(1) (0) | 2020.09.07 |