DiskFileItemFactoryによるファイルアップロード

13457 ワード

JSPページでは、formフォームのmethodをpostに設定し、enctype="multipart/form-data"を設定する必要があります.
"text/html;charset=UTF-8" %>
<HTML>
<HEAD>
    <title>    title>
HEAD>
   <body>
     <div>
         <form action="upFile.do" method="post" enctype="multipart/form-data">
             <table>
                 <tr>
                     <td>  td>
                     <td><input name="name" type="text">td>
                     <td>  td>
                     <td><input name="age" type="text">td>
                     <td>    td>
                     <td><input name="file" type="file">td>
                     <td><input type="submit" value="  ">td>
                 tr>
             table>
         form>
     div>
   body>
HTML>

コアAPI-DiskFileItemFactory DiskFileItemFactoryは、FileItemオブジェクトを作成するファクトリです.このファクトリクラスの一般的な方法:1、public void setSizeThreshold(int sizeThreshold):メモリバッファのサイズを設定し、デフォルト値は10 Kです.アップロードファイルがバッファより大きい場合、fileuploadコンポーネントは一時ファイルキャッシュを使用してアップロードファイルをキャッシュします.2、public void setRepository(Java.io.File repository):一時ファイルディレクトリを指定し、デフォルト値はSystem.getProperty(“java.io.tmpdir”). 3、public DiskFileItemFactory(int sizeThreshold,java.io.File repository):コンストラクション関数
コアAPI-S ervletFileUploadサーブレットFileUploadは、アップロードされたファイルデータを処理し、フォーム内の入力項目を1つのFileItemオブジェクトにカプセル化します.一般的な方法は、1、boolean isMultipartContent(H ttpServeretRequest request):アップロードフォームがmultipart/form-dataタイプであるかどうかを判断する
2、List parseRequest(HttpServeretRequest request):requestオブジェクトを解析し、フォームの各入力項目をfile Itemオブジェクトにパッケージし、すべてのFileItemを保存したリストセットを返します.
3、setFileSizeMax(long fileSizeMax):アップロードファイルの最大値(単一ファイル)を設定し、単一アップロードファイルの最大サイズ制限を設定し、クライアントが超大ファイルを悪意的にアップロードしてサーバ側のストレージスペースを浪費しないようにする.そのパラメータはバイト単位のlong型数値です.
4、setSizeMax(long sizeMax):アップロードファイルの総量の最大値(すべてのアップロードファイル)を設定し、要求メッセージエンティティの内容(つまりすべてのアップロードデータ)の最大サイズ制限を設定し、クライアントが悪意を持って大きなファイルをアップロードしてサーバ側のストレージスペースを浪費することを防止する.そのパラメータはバイト単位のlong型数値です.
5、setHeaderEncoding(java.lang.String encoding):符号化フォーマットを設定します.ファイルアップロード要求のメッセージ体では、通常のフォームドメインの値がテキスト内容であるほか、ファイルアップロードフィールドのファイルパス名もテキストであり、メモリに保存されているのは、それらのある文字セットが符号化されたバイト配列であり、Apacheファイルアップロードコンポーネントはこれらの内容を読み取る際に、それらが採用した文字セット符号化を知る必要がある.を選択してもアクセスできます.
コアAPI-FileItem FileItemクラスの一般的なメソッド:1、boolean isFormField():isFormFieldメソッドは、FileItemクラスオブジェクトがカプセル化されたデータが通常のテキストフォームフィールドであるか、ファイルフォームフィールドであるかを判断し、通常のフォームフィールドである場合trueを返します.そうでない場合falseを返します.
2、String getName()ファイルアップロードフィールドのファイル名を取得するために使用します.注意IEまたはFireFoxで取得したファイル名は異なり、IEでは絶対パスであり、FireFoxではファイル名のみである.
3、String getFieldName()フォームラベルname属性の値を返すために使用します.
4、void write(File file):FileItemオブジェクトに保存されているマスターコンテンツを指定したファイルに保存します.FileItemオブジェクトのマスターコンテンツが一時ファイルに保存されている場合、このメソッドが正常に完了すると、一時ファイルが消去される可能性があります.この方法では、通常のフォームフィールドの内容を1つのファイルに書き込むこともできますが、アップロードされたファイルの内容をローカルファイルシステムに保存することが主な目的です.
5、String getString():FileItemオブジェクトに保存するデータストリームの内容を1つの文字列で返すために使用され、2つのリロードの定義形式がある:public Java.lang.String getString(); public java.lang.String getString(java.lang.String encoding) throws java.io.UnsupportedEncodingException前者はデフォルトの文字セット符号化を使用して本体コンテンツを文字列に変換し、後者はパラメータで指定した文字セット符号化を使用して本体コンテンツを文字列に変換します.通常のフォームフィールド要素の内容を読み込むときに中国語の文字化けしが発生した場合は、2番目のgetStringメソッドを呼び出し、正しい文字セットの符号化名を渡します.
6、void delete():deleteメソッドは、FileItemクラスオブジェクトに格納されているマスターコンテンツを空にするために使用され、マスターコンテンツが一時ファイルに保存されている場合、deleteメソッドはその一時ファイルを削除します.FileItemオブジェクトがゴミ収集器で収集されると自動的に一時ファイルが消去されますが、deleteメソッドを呼び出すと、一時ファイルがより早く消去され、システムストレージリソースが解放されます.
実装手順:1、DiskFileItemFactoryオブジェクトを作成し、バッファサイズと一時ファイルディレクトリを設定します.2、DiskFileItemFactoryオブジェクトを使用してサーブレットFileUploadオブジェクトを作成し、アップロードファイルのサイズ制限を設定します.3、サーブレットFileUploadを呼び出す.parseRequestメソッドはrequestオブジェクトを解析し,アップロードされたすべてのコンテンツを保存したリストオブジェクトを得る.4、listを反復し、各反復ごとに1つのFileItemオブジェクトを呼び出し、そのisFormFiledメソッドを呼び出してアップロードファイルであるかどうかを判断する:4.1、一般フォームフィールドである場合、getFiledName、getStringメソッドを呼び出してフィールド名とフィールド値を得る.4.2.ファイルをアップロードする場合、getInputStreamメソッドを呼び出してデータ入力ストリームを取得し、アップロードデータを読み出す.
導入するjarパッケージ:
    <dependency>
      <groupId>commons-fileuploadgroupId>
      <artifactId>commons-fileuploadartifactId>
      <version>1.3.1version>
    dependency>
    <dependency>
      <groupId>commons-iogroupId>
      <artifactId>commons-ioartifactId>
      <version>2.4version>
    dependency>

コード実装:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{

        response.setContentType("text/html;charset=UTF-8");

        //         
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //            ,   10K
       // factory.setSizeThreshold(1024*1024);
        //           :                ,                
        factory.setRepository(new File("D:\\YOHO\\"));
       //       
        ServletFileUpload upload=new ServletFileUpload(factory);
       //            ,    long  1M
        upload.setSizeMax(1024*1024);
        //            
        upload.setFileSizeMax(1024*1024);
        //      
        upload.setHeaderEncoding("UTF-8");

        try {
            //    ,              FileItem  
            List itemList=upload.parseRequest(request);
            for(FileItem item:itemList){
                //                   
                if(item.isFormField()){
                    //      ,  input  name    
                    String name=item.getFieldName();
                    //        
                    String value=item.getString("UTF-8");
                    System.out.println("name="+name+"  value="+value);
                }else{
                    //      ,             
                    //  IE FireFox            ,IE      ,FireFox      。
                    String fileName=item.getName();
                    System.out.println(fileName);
                    //      name    
                    String namede=item.getFieldName();
                    System.out.println(namede);

                   //   :              
                    InputStream is=item.getInputStream();
                    FileOutputStream fos=new FileOutputStream("D:\\wps\\"+fileName);
                    byte[] buff=new byte[1024];
                    int len=0;
                    while((len=is.read(buff))>0){
                        fos.write(buff);
                    }

                    //   :        
                    // FileItem                     。
                    //   FileItem                   ,        ,           
                    item.write(new File("D:\\sohucache\\"+fileName));
                    is.close();
                    fos.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
//  :
//    
name=name  value=   
name=age  value=25
//    :          ,,IE        
asosResult.txt
//jsp name    
file

参考文献:http://blog.csdn.net/wenzhihui_2010/article/details/39397837 http://blog.csdn.net/u012814506/article/details/47783941