1

multipart/form-data以下のメソッドは、リクエストで指定された解析のために doPost メソッドによって呼び出されます。それはすべてうまく機能しますが、何が起こっているのか本当にわかりません。誰かが私の試みで3行を分解できれば、本当に感謝しています. Apache Commons File Upload のドキュメントを読みましたが、意味がわかりません。完全に理解していないコードを書くのは嫌いです。特に、ファクトリ オブジェクトとアップロード オブジェクトが作成されるときに実際に何が起こっているのかを知りたいです。

public static List<FileItem> parseFormRequest(HttpServletRequest request)
{
    List<FileItem> items = null;

    try 
    {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        items = upload.parseRequest(request);
    } 
    catch (FileUploadException error) 
    {
        System.out.println("UploadFileServlet - Error With File Parsing - " + error.getMessage());
    }

    return items;
}

ボーナスヘルプ!

また、その下に警告が表示さupload.parseRequest(request)れますType safety: The expression of type List needs unchecked conversion to conform to List<FileItem>。誰かがこれも説明できれば、それは私がやったことを理解するのに本当に役立ちます. ありがとう

ここに画像の説明を入力

4

3 に答える 3

2

factory は単なるヘルパーです。後で説明します。主な作業は によって行われますServletFileUpload

ServletFileUploadアップロードされたすべてのファイルをスキャンします (MIME を解析し、境界マーカー、コンテンツの長さなどを処理する方法を知っている Iterator を使用します)。

アップロードされたファイルごとに、parse メソッドは、FileItemFactoryアップロードされたファイルのローカル表現を作成するように要求し、メモリから (たとえば、メモリに保持されている HTTP POST 要求から) コンテンツをディスク上の実際のファイルにコピーします。

手順を簡略化すると、次のようになります。

  • 次にアップロードされたファイルを取得する
  • ファクトリにローカル ファイル ("FileItem") を要求する
  • インメモリ (HttpServletRequest から) からローカル ファイル (DiskFileItemFactory の場合は java.io.File) にコンテンツをコピーします。
  • HTTP リクエストの最後に到達するまでループします

詳細については、次のクラスのソースを参照してください

  • org.apache.commons.fileupload.FileUploadBase.parseRequest(RequestContext)
  • org.apache.commons.fileupload.FileUploadBase.FileItemIteratorImpl.FileItemStreamImpl

この設計により、ファイルの別のストレージ機能に切り替えることができます。たとえば、DiskFileItemFactory を独自の DatabaseFileItemFactory に置き換えることができるため、アップロードされたファイルはサーバー上のローカル ファイルではなくデータベースに保存されます。コードの変更は 1 行のみに影響し、残りの commons-fileupload はそのまま使用できます (たとえば、HTTP 要求の解析、アップロードされたファイルの反復処理など)。

2 番目の質問: commons-fileupload は Java 1.4 と互換性があるように見えるため、 の戻り値の型parseRequest() は実際には型指定されていません。java.util.Listリストには FileItem オブジェクトのみが含まれているという宣言がありません (例: java.util.List<FileItem>)。変数itemsの型が であると宣言したためList<FileItem>、Java コンパイラはこの不一致について警告します。

この場合、正しく実行したので、次を追加して警告を無視できます。

@SuppressWarnings( "unchecked" )
public static List<FileItem> parseFormRequest(HttpServletRequest request)
{
   ...
于 2012-12-06T15:51:52.190 に答える
0

ドキュメントに時間を費やす必要があります。

私が収集できることから、ServletFileUploadインスタンスは、指定したファクトリを使用して、リクエストにあるファイル インスタンスを実際に作成します。ファイルをディスクに書き込むファクトリを使用しました。ただし、他のオプションがあります(メモリなど)。ファクトリを指定することにより、作成されるファイルのタイプを指定しています。

電話すると

upload.parseRequest(request)

ServletFileUploadインスタンスは要求データを処理し、ファクトリを使用して実際に見つけたファイルを作成し、それらをリストで返します。

parseRequest ドキュメントを見ると、そのメソッドはList. コードでは、返されたリストをList<FileItem>. これにはキャストが必要なため、コンパイラの警告が表示されます。

于 2012-12-06T15:34:11.240 に答える
-1

この関数を呼び出すために使用される Java コードが必要です... HttpServletRequest にパラメーターを追加するために使用されるサーブレット コードが必要です

于 2013-12-12T06:48:09.920 に答える