サーブレット3@MultiPartConfig
アノテーションを使用して、アプリケーションにファイルのアップロードを実装しています。実行時にmultipart-configロケーションパラメーターを設定する必要があります(注釈パラメーターのハードコードではありません)。サーブレットのmultipart-configにプログラムでアクセスするためのAPIはありますか?
ありがとう
サーブレット3@MultiPartConfig
アノテーションを使用して、アプリケーションにファイルのアップロードを実装しています。実行時にmultipart-configロケーションパラメーターを設定する必要があります(注釈パラメーターのハードコードではありません)。サーブレットのmultipart-configにプログラムでアクセスするためのAPIはありますか?
ありがとう
@MultiPartConfigは、実際にはコンテナの単なるマーカーインターフェイスです。サーブレットが初期化されると、提供されたアノテーション値がプロキシオブジェクトを使用してサーブレットにマップされます。着信リクエストがマルチパート/フォームデータの場合、アップロードのパーツはリクエストにマッピングされ、コンテナはアノテーションの値とリクエストのパーツに基づいて必要な作業を実行します。このプロセスはすべてコンテナの内臓内で行われるため、このプロセスを傍受する方法はありません。ただし、1つの選択肢があります。ファイルシステム操作を2回実行する必要があります。すべてのパーツが揃っているので、ファイルを再構築して、選択した場所に「再アップロード」できます。以下の方法のようになります。
@Override
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
throws ServletException, IOException {
httpServletResponse.setContentType("text/html");
PrintWriter printWriter = httpServletResponse.getWriter();
InputStream inputStream;
FileOutputStream fileOutputStream;
for (Part part : httpServletRequest.getParts()) {
inputStream = httpServletRequest.getPart(part.getName()).getInputStream();
int i = inputStream.available();
byte[] b = new byte[i];
inputStream.read(b);
String fileName = "";
for (String temp : part.getHeader("content-disposition").split(";")) {
if (temp.trim().startsWith("filename")) {
fileName = temp.substring(temp.indexOf('=') + 1).trim().replace("\"", "");
}
}
String uploadDir = "/temp";
fileOutputStream = new FileOutputStream(uploadDir + "/" + fileName);
fileOutputStream.write(b);
inputStream.close();
fileOutputStream.close();
printWriter.write("Uploaded file " + uploadDir + "/" + fileName + ".");
}
}
私も同じ問題を抱えていましたが、解決策は簡単です。標準のサーブレット3.0ファイルのアップロードだけでは不十分です。ApacheFileUploadCommonsからjarファイルを取得するだけで、完了です。
StreamingAPIを使用したこの非常に明確な例を見てください
ServletFileUpload upload = new ServletFileUpload();
// Parse the request
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if ( item.isFormField() == false)
System.out.println("File field " + name + " with file name "
+ item.getName() + " detected.");
FileOutputStream fos = new FileOutputStream("your_location");
Streams.copy ( stream, fos, true);
}
}