Java appengine のブロブストアにファイルをアップロードしようとしています。ファイルをアップロードする POST リクエスト (アップロード URL を作成した後) には、いくつかの追加の投稿パラメーターがあります。サーブレット チェーンが実行されると、フィルターはこれらのパラメーターにアクセスできません (パラメーター マップは空です) が、アップロード完了コールバックはアクセスできます。
HTTP フィルターからこれらの投稿パラメーターにアクセスするにはどうすればよいですか?
Java appengine のブロブストアにファイルをアップロードしようとしています。ファイルをアップロードする POST リクエスト (アップロード URL を作成した後) には、いくつかの追加の投稿パラメーターがあります。サーブレット チェーンが実行されると、フィルターはこれらのパラメーターにアクセスできません (パラメーター マップは空です) が、アップロード完了コールバックはアクセスできます。
HTTP フィルターからこれらの投稿パラメーターにアクセスするにはどうすればよいですか?
私の理解が正しければ、POST リクエストでフィルターを実行して、blobstoreService.createUploadUrl()
?
ブロブストア サービスの直接の URLcreateUploadUrl()
を提供するため、これは不可能です。アップロードが完了すると、ハンドラーが呼び出され、この時点で (既にお気づきのように) フィルターを介してヘッダーを検査できます。
アップロードの発生時に検査する必要がある場合は、独自のファイル アップロード ハンドラを作成し、ファイルを blobstore に直接書き込みます。
更新: OPは質問を明確にしました。
アップロードは、コンテンツを含む HTTP POST である必要がありますmultipart/form-data
。GAE は要求を書き換えて、ファイル本体を削除し、blob キーをフォーム パラメーターとして追加します。Uploading the Blob docsの最後の段落を読んでください。
GAE はサーブレット API 2.5 であるため、このパラメーターをgetParameter()
手動で取得する必要があります (機能しません)。
フィルタ内のリクエスト コンテンツを検査する際の問題は、 を介して提供されるリクエスト ボディをrequest.getInputStream()
1 回しか使用できないことです。フィルターで実行すると、フィルターの後に呼び出されたサーブレットはそれを取得しません。これを回避するには、リクエストをラップしてコンテンツをバッファリングする必要があります - ダンプ フィルタの例を参照してください: https://github.com/leanengine/LeanEngine-Server/blob/master/lean-server-lib/src /main/java/com/leanengine/server/DumpFilter.java
request.getParameter("paramName");
およびrequest.getInputStream()
アップロードされたファイルの場合。