req.file()
指定されたfield
から受信したマルチパートファイルアップロードを表すSkipper Upstreamを構築して返します。
req.file(field);
引数 | 型 | 詳細 | |
---|---|---|---|
1 | field |
アップロードを監視するファイルパラメータの名前。例:avatar 。 |
req.file()
は、元のConnectボディパーサーの意見の異なるバリアントであるSkipperから来ています。Skipperを使用すると、アプリケーションロジックに大きな変更を加えることなく、高性能なストリーミングファイルアップロードを利用できます。
この簡素化に伴い、小さな注意点があります。**テキストパラメータは、リクエストボディ内でファイルの前に含める必要があります。**通常、これらのテキストパラメータには、ファイルアップロードに関する追加情報を提供する文字列メタデータが含まれています。
Sailsへのマルチパートリクエストは、すべての**ファイルパラメータ**を送信する前に、すべての**テキストパラメータ**を送信する必要があります。たとえば、Sailsと通信するウェブフロントエンドを構築している場合、フォームアップロードまたはAJAXファイルアップロードリクエストで、テキストパラメータを最初に含める必要があります。「テキストパラメータ」という用語は、アップロードに関する追加情報を提供するファイルと共に送信する可能性のあるメタデータパラメータを指します。
Skipperは、すべてのファイルアップロードをストリームとして扱います。これにより、ユーザーは最小限のパフォーマンスへの影響とディスク容量を使用せずに、巨大なファイルをアップロードでき、TMPファイルに関連する悪質なサービス拒否攻撃からアプリケーションを保護できます。
マルチパートリクエストがサーバーにヒットすると、一時ファイルをディスクに書き込む代わりに、Skipperはアプリケーションコードを実行するのに十分な長さだけリクエストをバッファリングし、互換性のあるBLOBレシーバーに「接続」できるようにします。特定のフィールドのデータに「接続」しない場合、Upstreamは「ハイウォーターマーク」に達し、バッファがフラッシュされ、そのフィールドのそれ以降の受信バイトは無視されます。
コントローラーアクションまたはポリシー内
// See the Skipper README on GitHub for usage documentation for `.upload()`, including
// a complete list of options.
req.file('avatar').upload(function (err, uploadedFiles){
if (err) return res.serverError(err);
return res.json({
message: uploadedFiles.length + ' file(s) uploaded successfully!',
files: uploadedFiles
});
});
- クライアントリクエストのテキストパラメータは、ファイルパラメータの前に送信する必要があることを忘れないでください!
req.file()
は、同じフィールドを介して送信された複数のファイルをサポートしますが、その結果として、それが返すUpstreamは、実際には潜在的なバイナリストリーム(ファイル)のストリーム(バッファされたイベントエミッター)であることに注意することが重要です。具体的には、Upstream
は、「オブジェクトモード」のNode.js Readableストリームであり、各オブジェクトはそれ自体が着信マルチパートファイルアップロードストリームです。- ストリームのストリームとしてUpstreamを直接操作する方が良い場合は、
.upload()
メソッドを省略し、「finish」および「error」イベントをバインドするか(または.pipe()
を使用するか)代わりにできます。内部では、.upload()
が行っているのは、Upstreamを指定されたレシーバーインスタンスにパイプし、Upstreamがfinish
またはerror
イベントを発行したときに指定されたコールバックを実行することだけです。