フォームベースのファイルアップロード



 
 
1.フォームベースのファイルアップロードフォームでフォーム要素を使用すると、ブラウザがフォームを解析する際に入力ボックスとボタンが自動的に生成され、入力ボックスはユーザーがローカルファイルのファイル名とパス名を記入できるようになり、ボタンは
ブラウザでファイル選択ボックスを開き、ユーザーがファイルを選択できるようにします.以下はフォームの例です.アップロードするファイルを選択してください.ファイルの説明を入力してください.  --------------------------------------------------------------------------------
2.Commons-fileuploadコンポーネントアップロードの基本原理:FileUploadコンポーネントは、textやファイルドメインfileなどのページにコミットされたすべての要素(通常のformフォームドメイン)を同じと見なします.
FileItemは、アップロードされたページによって発行されたrequest要求、すなわちFileItemの順序付けされた組合せであり、FileUploadコンポーネントはrequestを解析し、1つ1つのFileItemを返すことができる.各FileItemに対して
FileUploadコンポーネントは、通常のformフォームドメインかファイルfileドメインかを判断し、異なるタイプに応じて異なる操作を行います.フォームドメインであれば値を読み出し、ファイルドメインであれば服にファイルを保存します.
HDDまたはメモリ.
 
 
 
 
--------------------------------------------------------------------------------
 
3.Commons-fileuploadコンポーネントAPI:Commons-fileuploadコンポーネントでは、主に以下の3つのインタフェースとクラスが使用されます:<1>サーブレットFileUploadは、アップロードされたファイルデータの処理を担当し、各部分のデータをFileItemオブジェクトにカプセル化します.<2>DiskFileItemFactoryは、FileItemオブジェクトを作成するファクトリです.このファクトリクラスでは、メモリバッファサイズと一時ファイルを格納するディレクトリを構成できます. 
関連方法:setSizeThreshold(int sizeThreshold)//byte単位でファイルのメモリ使用量を設定し、ファイルを一時保存する.setRepository(java.io.File repository)/テンポラリファイルの格納パスを設定<3>サーブレットFileUploadアップロードファイルデータを受信すると、内容がメモリキャッシュに保存され、ファイル内容がDiskFileItemFactoryで指定されたバッファの大きさを超えると、ファイルはディスクに保存されます.DiskFileItemFactory指定ディレクトリの一時ファイルとして保存します.ファイルデータの受信が完了すると、サーブレットUploadは
ファイルには、アップロードされたファイルディレクトリの下にあるファイルにデータが書き込まれます.
関連方法:isMultipartContent(javax.servlet.http.HttpServeretRequest request)/クライアント要求がPOSTであるか否かを判断し、enctype属性が「multipart/form-data」であるか否かを判断する
parseRequest(javax.servlet.http.HttpServletRequest request)
//「multipart/form-data」データストリームを読み込む
を選択します.   
setSizeMax(long sizeMax)/ファイルのアップロードを許可する最大サイズの設定
 
--------------------------------------------------------------------------------
4.FileItemクラスは、名前に基づいて翻訳されたファイル項目であり、コミットされたフォームのコントロールを表し、サーブレットFileUploadのparseRequest()ファイルはフォーム全体のすべてのFileItem項目のリストを返します.
  • boolean isFormField()/フォーム・アイテムがファイル・アイテムか、通常のテーブル・アイテムかを判断します.  
  •   
  • String getFieldName()/ファイル・アイテムでない場合は、対応するテーブル・アイテムのフォーム名を返します.  
  •   
  • String getString()/ファイル・アイテムでない場合は、デフォルトのエンコードでアイテムの内容を返します.  
  •   
  • String getString//指定符号化でその内容を返します.  
  •   
  • long getSize()/byte単位で
  • を返します.
  •   
  • String getName()/ファイルアイテムの場合、クライアントブラウザ
  • によってファイル名が返されます.
  •   
  • void write(java.io.File file)/ファイル項目であれば、対応するファイルに
  • を書き込む
  •   
  • java.io.InputStream getInputStream()   
  •   
  • java.io.OutputStream getOutputStream()  

  •  
    --------------------------------------------------------------------------------
    5.FileUploadコンポーネントを使用してファイルアップロードを実現するには、<1>フォームのmethod=「POST」、enctype=「multipart/form-data」<2>FileItemFactoryインスタンスの作成:DiskFileItemFactory=new DiskFileItemFactory()setSizeThresholdとsetRepository<3>サーブレットFileUpladインスタンスの作成:サーブレットFileUpload=newサーブレットFileUpload(factory);setSizeMaxおよびsetFileSizeMax<4>サーブレットFileUploadインスタンス解析要求を使用して、FileItemのList:List items=uploadを取得する.parseRequest(request);<5>4で得られた集合を巡り,フォームドメインかファイルドメインかを判断する.6>フォームドメイン関連メソッド:item.getFieldName()フォームの名前を取得します.item.getString()は、フォームの値を取得します.<7>ファイルドメイン関連メソッド:item.getName(), getContentType(), getSize().<8>注意1:サーブレットではrequestは使用できません.getParameter()メソッドは要求パラメータを取得します.JSPページでも${param.xxx}を使用してデータのエコーを行うことはできません.<9>注意2:フォームの文字化けしについて.servletFileUplaod.setHeaderEncoding(“UTF-8”); ファイルドメインの文字符号化の問題を解決できます.new String(value.getString("iso-8859-1"),"UTF-8");フォームドメインの文字符号化の問題を解決します.
     
    --------------------------------------------------------------------------------
     
     
     
    6.サーバ側サーブレットコードの例を次に示します.
     
    //ファイルアップロードサンプルプログラム//フォームがenctype="multipart/form-data"if(サーブレットFileUpload.isMultipartContent){DiskFileItemFactory dfif=new DiskFileItemFactory();dfif.setSizeThreshold(5*1024*1024);//メモリ使用量が5 Mを超えると、一時ファイルが生成され、一時ディレクトリに格納されるように設定します.                    dfif.setRepository(new File("d:\\temp"));//一時ファイルを格納するディレクトリを設定します.                                        ServletFileUpload fileupload = new ServletFileUpload(dfif);                    fileupload.setSizeMax(50 * 1024 * 1024);//最大50 Mまでアップロードできるファイルを設定します.                                        List files = fileupload.parseRequest(request);for(FileItem f:files){if(f.isFormField()}//このアイテムがフォームアイテムであれば、ファイルアップロードアイテムout.print(f.getFieldName();out.print(f.getString(「UTF-8」));//WebはUTF-8コードを使用しているので、クライアントが返すのもUTF-8コードです.}else{//itemがFormドメインでないと判断した場合、ディレクトリとファイルの名前String filename=item.getName()を作成し、String videoFileEnd=filename.substring(                                   filename.lastIndexOf("."),                                   filename.length());                          try {                                        endname = videoFileEnd.toLowerCase();                              } catch (Exception e) {                        }                              File file = new File(path);                             if(!file.exists()){                                               file.mkdir();                              }   //3. アップロード画像File photoFile=new File(path+"/"+name+endname);                                      item.write(photoFile); }}else{out.print(「提出したフォームにエラーがあります!」);    }