2012-08-01 18 views
5

私はExpress.jsを使用していて、サイズを変更する必要がある画像をアップロードするルートを持っています。現在のところ、Expressはディスクにファイルを書き込んだり(node-formidableを使っていると思います)、ディスクに2番目のバージョンを書き込むgm(http://aheckmann.github.com/gm/)を使ってサイズを変更します。私はあなたがそれをディスクに書き込む前に、node-formidableファイルストリームを手に入れることができ、かつgm以降だけではなく、パスの流れを受け入れることができる読んだdouble.writeを削除するために、Express.jsでgm経由でアップロードされたストリームファイル

gm(path) 
    .resize(540,404) 
    .write(dest, function (err) { ... }); 

、私はこの権利を渡すことができるはずですディスクへの二重書き込みを排除することで実現します。

私はform.onPartを上書きする必要があると思うが、私はどこか分からない(それはExpressミドルウェアとして行われるべき?)、私はformのホールドを取得するか、partと正確に何をするかわかりません。これは私がいくつかの場所で見てきたコードスケルトンです:

form.onPart = function(part) { 
    if (!part.filename) { form.handlePart(part); return; } 

    part.on('data', function(buffer) { 

    }); 
    part.on('end', function() { 

    } 
} 

は、誰かが私が一緒にこれら2つを入れて助けることができますか?ありがとう!

答えて

7

あなたはform.onPartを書き換えて正しい軌道に乗っています。既定では、ディスクへの書き込みが可能なので、実行する前に実行します。

部品自体はストリームなので、gmなど、必要なものにパイプすることができます。ミドルウェアについては

var form = new formidable.IncomingForm; 
form.onPart = function (part) { 
    if (!part.filename) return this.handlePart(part); 

    gm(part).resize(200, 200).stream(function (err, stdout, stderr) { 
    stdout.pipe(fs.createWriteStream('my/new/path/to/img.png')); 
    }); 
}; 

、私は接続/ Expressからmultipartミドルウェアをコピー - ペーストし、それにonPart機能を追加したい:私はそれをテストしたが、これはドキュメントに基づいて理にかなっていない

formidableがデフォルトでディスクに書き込まれなかった場合や、フラグがセットされていた場合は、もっとうまくいくでしょうか?彼らに問題を送ることができます。

+0

ありがとうございました!これは私にその道の95%を与えました。私の最後の問題は、 'gm'は非同期で、サイズ変更が実際に完了する前にフォーム解析が返されるということです(クライアントに戻ってきたURLはまだ良いとは言えません)。 'partid'ハンドリングが実際に完了したときに'恐ろしい 'を知らせる方法はありますか? – Bill

+0

実際には、私はちょうど代わりにクライアントでこれを処理して終了 - 良い方法で動作します。再度、感謝します! – Bill

+1

stdoutはストリームです。そのため、ファイルWriteStreamにpipe()することができます。そして、それはあなたが聞くことができる "終わり"のイベントがあることを意味します。 stdout.on( 'end'、fn)を実行するだけで、クライアントにジョブが完了したことを伝えることができます。 – juandopazo

関連する問題