大津です。

最初簡単にチェックできるのかなと考えていたのですが、思いのほか複雑になりました。

POSTでリクエストボディで送られてくるサイズをサーバでチェックするには次の2通りあります。

1) クライアントが Content-Length を送ってからボディを送信する時。
  これは一番簡単で Content-Length のサイズをチェックしてはじけばいいだけ。

2) クライアントが Transfer-Encoding: chunked でボディを送信する時。
  これが一番やっかいで、クライアントから送信されてくるデータのサイズを
  送られてくる毎に積算してチェックしないといけません。
  通常の express の middleware で route すると、ファイル書き込み処理も同時に
  処理されるのでどうしても制限値までのファイルがpipeで書き込まれる状況になっ
  てしまいます。なので route を使うのはどうしても難しいかなと思います。
  替りに新しく request オブジェクトもどきを作ってやって、アップロードサイズ
  チェック後にミドルに渡すという方法ぐらいしかないかなと。
  (他にスマートなやり方があれば誰か教えてください。)

ということで、サンプルを以下にあげました。

https://gist.github.com/shigeki/7540543

利用環境が書いていないのですが、 connect.multipart が deprecate 予定らしいので

https://github.com/senchalabs/connect/wiki/Connect-3.0

替りに multiparty を使ってます。 node-v0.10.22 + express@3.4.4 で動作確認してます。
(express2.x ぽいですが、そこまで見る時間がないです。)
 
これ見ると、制限値までのファイル作成を許容するか、クライアントからの
Transfer-Encoding: chunked での POST を禁止して、Content-Length だけのチェックするよ
うにするか、どちらかにした方が断然楽ですね。


(2013/11/18 22:43), Leo Azuki wrote:
> 江口さん ご返信ありがとうございます。
> 
>  >もしかしたら、間違っているかもしれませんが、サーバ側でバリエートチェックした時点では、ファイルがアップロードされちゃうと思います。
> 
> 実はapp.limit('2mb')の部分のバリデートではファイルのアップロードが防がれていまして、ということはサーバー側でなんとかなるのではないかと思ったので
>  
> すがクライアントチェックでやるのもよさそうですね。 ただクライアントチェックですと既にアップされた同名ファイルのチェックは、一度サーバー検索かけ 
> た結果をクライアントに戻してチェックする形になるのでしょうか?
> 
> node.jsを用いたファイルアップロード処理は結構多そうなのでぜひお知恵を拝借させてください。 よろしくお願いします。
> 
> 2013年11月18日月曜日 21時05分39秒 UTC+9 えぐぴょん:
> 
>     こんばんは
>     江口です。
> 
>     もしかしたら、間違っているかもしれませんが、サーバ側でバリエートチェックした時点では、ファイルがアップロードされちゃうと思います。
> 
>     HTTPはリクエスト−レスポンス方式なので、リクエストの電文にファイルも載ってきてしまいますから、レスポンスで、これは受け入れられなかったと、ク
>     ライアントに返答できますが、リクエストに載ってっきてしまったファイルはサーバ側で削除するしかないとおもいますが・・・
> 
>     アップロードする前に、クライアント(Webブラウザ側)でバリエートチェックするのがいいと思いますが・・・
> 
>     以上、ご参考までに
>     Kazuyuki Eguchi
> 
> 
>     2013年11月18日 19:56 Leo Azuki <azuk...@gmail.com <javascript:>>:
>      > node.js, expressを用いたシステムを構築中でして、イメージファイルのアップロード処理にてお聞きします。
>      > 
> fs.renameを用いてアップロード処理にて、同名のファイル、jpeg,gif,png以外、2メガ以上のファイルはアップロードできないように実装していま
>     す。、ポスト後のサーバー側の処理にてバリデートは正常にひっかかるのですが、app.postでリクエストが届いた直後に指定のフォルダにファイルがアップ
>     ロードされてしまっています。(ファイル名はこんな感じです。e84df8517af642bb96bf0cd80e30b100.jpg)バリ
>      > バリデートにひっかかったら、ファイルはアップロードされないようにしたいのですが、どなたか知恵を拝借させていただきたく投稿いたします。
>      > よろしくお願いします。 app.configureの設定は以下のようにしています。
>      >
>      >  app.configure(function() {
>      >   app.set('port', process.env.PORT || 3000);
>      >   app.use(express.limit('2mb'));
>      >   app.use(express.bodyParser({
>      >     //onPart: onPart,
>      >     keepExtensions: true,
>      >     uploadDir: './uploads/fullsize'
>      >   }));
>      >   app.use(express.cookieParser());
>      >   app.use(express.session({secret: '○○○'}));
>      >   app.use(express.methodOverride());
>      >   app.use(express.static(path.join(application_root, 'public')));
>      >   app.use(flash());
>      >   app.use(app.router);
>      >   app.use(lib.notFoundHandler);
>      >   app.use(lib.errorHandler);
>      >  });
>      >
>      > --
>      >
>      > ---
>      > このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
>      > このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscr...@googlegroups.com 
> <javascript:> にメールを送信します。
>      > その他のオプションについては、https://groups.google.com/groups/opt_out 
> <https://groups.google.com/groups/opt_out> にアクセスしてください。
> 
> -- 
> 
> ---
> このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscr...@googlegroups.com にメールを送信します。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

-- 

--- 
このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、nodejs_jp+unsubscr...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。

メールによる返信