2012년 9월 1일 토요일

node.js 에서 system call을 사용하는 방법


cloud9 을 사용해서 작업하고 있는데
업로드는 드래그&드랍으로 훌륭하게 지원하는 반면 다운로드를 지원하지 않아 조금 아쉽다.
child_process 패키지를 사용하여 폴더를 전체를 압축한 다음 내려주자.
http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options
spawn을 사용해서 만들었다.

대충 express 를 통해 파일을 만들고 route/index.js 를 다음과 같이 해보았다.
/*
 * GET home page.
 */
var spawn=require('child_process').spawn;
var fs=require('fs');
exports.index = function(req, res) {
var zip=spawn('zip',['-r', 'archive.zip', '.', '-i', '*']);
zip.stdout.on('data', function (data) {
console.log('stderr: ' + data);
});
zip.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
zip.on('exit', function() {
res.setHeader('Content-type', 'application/octet-stream')
res.setHeader('Content-disposition', 'attachment; filename=archive.zip');
res.write(fs.readFileSync(__dirname+'/../archive.zip'));
res.end();
});
}

stdout.on -> 표준 출력 가져오기
stderr.on -> 오류 출력 가져오기

zip 파일로 내려주기 위해 Content-type 과 파일명을 setHeader 를 통해 붙여주자.
참 쉽죠?