5

私は使用Express.jsしていて、画像をアップロードするルートがあり、サイズを変更する必要があります。現在Express、ファイルをディスクに書き込んでから(http://aheckmann.github.com/gm/)をnode-formidable使用してサイズを変更し、2番目のバージョンをディスクに書き込みます。gm

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

node-formidableディスクに書き込む前にファイルストリームを保持できることを読みましgmた。パスだけでなくストリームを受け入れることができるので、ディスクへの二重書き込みを排除することで、これを正しく渡すことができるはずです。

オーバーライドする必要があると思います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つの部分を組み合わせるのを手伝ってもらえますか?ありがとう!

4

1 に答える 1

7

書き直すことで正しい軌道に乗っていますform.onPart。デフォルトでは、ディスクへの書き込みが非常に多いため、そうなる前に対処する必要があります。

パーツ自体が Streams であるため、 など、必要なものにパイプできます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'));
  });
};

ミドルウェアに関しては、Connect/Express からミドルウェアをコピーペーストし、関数をmultipart追加します: http://www.senchalabs.org/connect/multipart.htmlonPart

formidableデフォルトでディスクに書き込まなかったり、フラグを指定したりした方がずっといいと思いませんか? 問題を送ることができます。

于 2012-08-03T18:28:50.080 に答える