express3 でファイルアップロード処理。

実は処理内容的には全然どってことないんやけど、ネットに上がってる先人のサンプルコードが微妙にバージョンが違うせいか、読み替えないといけないところがある。
読み替えなアカン部分ってのは、ほんとにちょっとだけなんやけどな。

ほんで、その先人たちのコードがちょっとだけバグってるっぽいとこがあったんで修正してみた。
どこがオリジナルなのかわかんないんやけど、ググったら大体同じコードが複数ヒットするんでコピって使ってるんやろと思う。

ま、これが本筋ってわけじゃないし、解説もくそもないんで、必要な全部のコードをのっけとく。
node 0.10.4 + express 3.12 + ejs テンプレート版。
現時点での最新バージョンなんで、しばらくはこれでイケるはず。検索エンジンから飛んできた人はどうぞー

app.js

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , upload = require('./routes/upload')
  , http = require('http')
  , path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);
app.post('/upload', upload.post);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

routes/upload.js

var fs = require('fs');
exports.post = function(req, res){
	var tmp_path = req.files.upload.path;
	var target_path = './uploads/' + req.files.upload.name;
	fs.rename(tmp_path, target_path, function(err) {
		if (err) throw err;
		res.send('File uploaded to: ' + target_path + ' - ' + req.files.upload.size + ' bytes');
	});
};

views/index.ejs

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>

    <form method="post" enctype="multipart/form-data" action="/upload">
      <input type="file" name="upload">
      <input type="submit">
    </form>
  </body>
</html>

使い方は express で生成したスケルトンを上のコードで差し替えるor追加して、アプリケーションのディレクトリと同じ高さに uploads ディレクトリを作成する。そんだけ。
個人的な好みで jade じゃ無くて ejs でやってるけど form タグ内で /upload って URL に mulitpart で post するだけなんで、jade にするんは簡単な筈。

俺っちにとってはここまでは準備で、その先は C# の領域になる。
IIS 上の ASP.NET へアップロードする方が簡単に実装できるんやけど、プラットフォームに中立な・・・言い換えると W3C のピュア HTTP 世界と繋ぎたかったんで node.js をサーバでやってみた。

こんなブログタイトルでやってるのに、JavaScript ネタばっかり書いてて C# はやってるんやけど書けないっつー変なジレンマに陥ってるな。
ま、自分の中に必要な要素が積みあがってけば良いだけの話なんで、ここには書けることだけ書いていくことにする。

JavaScript ネタだけに集中するブログを立ち上げた方が良いかも知らんってのは最初から思ってる通りなんやけどね。

今日はここまで。