サーブレットファイルのアップロード


サーブレットを HTML フォームタグとともに使用すると、ユーザーがファイルをサーバーにアップロードできるようになります。アップロードされるファイルは、テキスト ファイル、画像ファイル、または任意のドキュメントです。

ファイル アップロード フォームを作成する

次の HTML コードは、ファイル アップロード フォームを作成します。以下の点に注意してください。

  • フォームのmethod属性にはPOSTメソッドを設定する必要があり、GETメソッドは使用できません。

  • フォームのenctype属性はmultipart/form-dataに設定する必要があります。

  • フォームのaction属性は、バックエンドサーバーでファイルのアップロードを処理するサーブレットファイルに設定する必要があります。以下の例では、UploadServlet サーブレットを使用してファイルをアップロードします。

  • 単一のファイルをアップロードするには、属性 type="file" を持つ単一の <input .../> タグを使用する必要があります。複数のファイルのアップロードを許可するには、異なる name 属性値を持つ複数の input タグを含めます。 input タグの name 属性の値は異なります。ブラウザは、各入力タグに参照ボタンを関連付けます。

 <html>
<head>
<title>文件上传表单</title>
</head>
<body>
<h3>文件上传:</h3>
请选择要上传的文件:<br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="上传文件" />
</form>
</body>
</html>

これにより、以下の結果が表示され、ユーザーがローカル コンピューターからファイルを選択できるようになります。ユーザーが [ファイルのアップロード] をクリックすると、ローカル コンピューターから選択したファイルとともにフォームが送信されます。

 <b>文件上传:</b> 
请选择要上传的文件:<br /> 
<input type="file" name="file" size="50" /> 
<br /> 
<input type="button" value="上传文件" /> 
<br /> 
注:这只是虚拟的表单,不会正常工作。

バックエンド サーブレットの作成

以下はサーブレット

UploadServlet で、アップロードされたファイルを受け入れ、ディレクトリ <Tomcat のインストール ディレクトリ>/webapps/data に保存します。このディレクトリ名は、以下に示すように、web.xml の context-param 要素などの外部設定を使用して追加することもできます。

 <web-app>
....
<context-param> 
    <description>Location to store uploaded file</description> 
    <param-name>file-upload</param-name> 
    <param-value>
         c:\apache-tomcat-5.5.29\webapps\data\
     </param-value> 
</context-param>
....
</web-app>

以下は、UploadServlet のソース コードです。これは、複数のファイルのアップロードを処理できます。一度。続行する前に、次のことを確認してください:

  • 以下の例は FileUpload に依存しているため、クラスパスに最新バージョンの

    commons-fileupload.x.x.jar ファイルがあることを確認してください。 http://commons.apache.org/fileupload/ からダウンロードできます。

  • FileUpload は Commons IO に依存しているため、クラスパスに最新バージョンの

    commons-io-x.x.jar ファイルがあることを確認してください。 http://commons.apache.org/io/ からダウンロードできます。

  • 次の例をテストする場合、アップロードするファイル サイズは

    maxFileSize より大きくすることはできません。それ以外の場合、ファイルはアップロードされません。

  • 事前にディレクトリ c:temp と c:apache-tomcat-5.5.29webappsdata が作成されていることを確認してください。

  • // 导入必需的 java 库
    import java.io.*;
    import java.util.*;
     
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.output.*;
    
    public class UploadServlet extends HttpServlet {
       
       private boolean isMultipart;
       private String filePath;
       private int maxFileSize = 50 * 1024;
       private int maxMemSize = 4 * 1024;
       private File file ;
    
       public void init( ){
          // 获取文件将被存储的位置
          filePath = 
                 getServletContext().getInitParameter("file-upload"); 
       }
       public void doPost(HttpServletRequest request, 
                   HttpServletResponse response)
                  throws ServletException, java.io.IOException {
          // 检查我们有一个文件上传请求
          isMultipart = ServletFileUpload.isMultipartContent(request);
          response.setContentType("text/html");
          java.io.PrintWriter out = response.getWriter( );
          if( !isMultipart ){
             out.println("<html>");
             out.println("<head>");
             out.println("<title>Servlet upload</title>");  
             out.println("</head>");
             out.println("<body>");
             out.println("<p>No file uploaded</p>"); 
             out.println("</body>");
             out.println("</html>");
             return;
          }
          DiskFileItemFactory factory = new DiskFileItemFactory();
          // 文件大小的最大值将被存储在内存中
          factory.setSizeThreshold(maxMemSize);
          // Location to save data that is larger than maxMemSize.
          factory.setRepository(new File("c:\temp"));
    
          // 创建一个新的文件上传处理程序
          ServletFileUpload upload = new ServletFileUpload(factory);
          // 允许上传的文件大小的最大值
          upload.setSizeMax( maxFileSize );
    
          try{ 
          // 解析请求,获取文件项
          List fileItems = upload.parseRequest(request);
    	
          // 处理上传的文件项
          Iterator i = fileItems.iterator();
    
          out.println("<html>");
          out.println("<head>");
          out.println("<title>Servlet upload</title>");  
          out.println("</head>");
          out.println("<body>");
          while ( i.hasNext () ) 
          {
             FileItem fi = (FileItem)i.next();
             if ( !fi.isFormField () )	
             {
                // 获取上传文件的参数
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                String contentType = fi.getContentType();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                // 写入文件
                if( fileName.lastIndexOf("\") >= 0 ){
                   file = new File( filePath + 
                   fileName.substring( fileName.lastIndexOf("\"))) ;
                }else{
                   file = new File( filePath + 
                   fileName.substring(fileName.lastIndexOf("\")+1)) ;
                }
                fi.write( file ) ;
                out.println("Uploaded Filename: " + fileName + "<br>");
             }
          }
          out.println("</body>");
          out.println("</html>");
       }catch(Exception ex) {
           System.out.println(ex);
       }
       }
       public void doGet(HttpServletRequest request, 
                           HttpServletResponse response)
            throws ServletException, java.io.IOException {
            
            throw new ServletException("GET method used with " +
                    getClass( ).getName( )+": POST method required.");
       } 
    }
サーブレットのコンパイルと実行

上記のサーブレット UploadServlet をコンパイルし、以下に示すように web.xml ファイルに必要なエントリを作成します:

 <servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

次に、上で作成した HTML フォームを使用してファイルをアップロードしてみます。ブラウザで http://localhost:8080/UploadFile.htm にアクセスすると、次の結果が表示され、ローカル コンピュータからファイルをアップロードするのに役立ちます。

 <b>文件上传:</b> 
请选择要上传的文件:<br /> 
<input type="file" name="file" size="50" /> 
<br /> 
<input type="button" value="上传文件" />

Servelt スクリプトが正しく動作する場合、ファイルは c:apache-tomcat-5.5.29webappsdata ディレクトリにアップロードされます。