文件上傳之Apache commons fileupload使用

http://www.cnblogs.com/xing901022/p/3855613.html


文件上傳的方法主要目前有兩個常用的,一個是SmartUpload,一個是Apache的Commons fileupload.

  我們這裏主要介紹下第二個的用法,首先要上傳文件,注意幾個問題:

  1 form表單內,要添加空間<input type="file" name="myfile">

  2 form表單的內容格式要定義成multipart/form-data格式

  3 需要類庫:1 commons-io.jar 2commons-fileupload-1.3.1.jar

  接下來我們看下他的用法。

  首先閱讀Apache commons fileupload的官方文檔可以發現下面幾個常用的函數:

  1 創建文件解析對象

DiskFileUpload diskFileUpload = new DiskFileUpload();

  2 進行文件解析後放在List中,因爲這個類庫支持多個文件上傳,因此把結果會存在List中。

List<FileItem> list = diskFileUpload.parseRequest(request);

  3 獲取上傳文件,進行分析(不是必須)

File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8"));

  4 創建新對象,進行流拷貝

複製代碼
file1 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());
                        file1.getParentFile().mkdirs();
                        file1.createNewFile();
                        
                        InputStream ins = fileItem.getInputStream();
                        OutputStream ous = new FileOutputStream(file1);
                        
                        try{
                            byte[] buffer = new byte[1024];
                            int len = 0;
                            while((len = ins.read(buffer)) > -1)
                                ous.write(buffer,0,len);
                            out.println("以保存文件"+file1.getAbsolutePath()+"<br/>");
                        }finally{
                            ous.close();
                            ins.close();
                        }
複製代碼

  這樣我們就完成了文件的上傳。

fileUpload.html

複製代碼
 <form action="servlet/UploadServlet" method="post" enctype="multipart/form-data">
        <div align="center">
            <fieldset style="width:80%">
                <legend>上傳文件</legend><br/>
                    <div align="left">上傳文件1</div>
                    <div align="left">
                        <input type="file" name="file1"/>
                    </div>
                    <div align="left">上傳文件2</div>
                    <div align="left">
                        <input type="file" name="file2"/>
                    </div>
                    <div>
                        <div align='left'>上傳文件說明1</div>
                        <div align='left'><input type="text" name="description1"/></div>
                    </div>
                    <div>
                        <div align='left'>上傳文件說明2</div>
                        <div align='left'><input type="text" name="description2"/></div>
                    </div>
                    <div>
                        <div align='left'>
                            <input type='submit' value="上傳文件"/>
                        </div>
                    </div>
            </fieldset>
        </div>
    </form>
複製代碼

web.xml

複製代碼
<servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.test.hello.UploadServlet</servlet-class>
  </servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/servlet/UploadServlet</url-pattern>
  </servlet-mapping>
複製代碼

UploadServlet.java

複製代碼
package com.test.hello;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

public class UploadServlet extends HttpServlet {

    /**
     * Constructor of the object.
     */
    public UploadServlet() {
        super();
    }

    /**
     * Destruction of the servlet. <br>
     */
    public void destroy() {
        super.destroy(); // Just puts "destroy" string in log
        // Put your code here
    }

    /**
     * The doGet method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to get.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setCharacterEncoding("UTF-8");
        response.getWriter().println("請以POST方式上傳文件");
    }

    /**
     * The doPost method of the servlet. <br>
     *
     * This method is called when a form has its tag value method equals to post.
     * 
     * @param request the request send by the client to the server
     * @param response the response send by the server to the client
     * @throws ServletException if an error occurred
     * @throws IOException if an error occurred
     */
    @SuppressWarnings({ "unchecked", "deprecation" })
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        File file1 = null,file2=null;
        String description1 = null,description2 = null;
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        
        DiskFileUpload diskFileUpload = new DiskFileUpload();
        try{
            List<FileItem> list = diskFileUpload.parseRequest(request);
            
            out.println("遍歷所有的FileItem...<br/>");
            for(FileItem fileItem : list){
                if(fileItem.isFormField()){
                    if("description1".equals(fileItem.getFieldName())){
                        out.println("遍歷到description1 ... <br/>");
                        description1 = new String(fileItem.getString().getBytes(),"UTF-8");
                    }
                    if("description2".equals(fileItem.getFieldName())){
                        out.println("遍歷到description2 ... <br/>");
                        description2 = new String(fileItem.getString().getBytes(),"UTF-8");
                    }
                }else{
                    if("file1".equals(fileItem.getFieldName())){
                        File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8"));
                        out.println("遍歷到file1...<br/>");
                        out.println("客戶端文件位置:"+remoteFile.getAbsolutePath()+"<br/>");
                        
                        file1 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());
                        file1.getParentFile().mkdirs();
                        file1.createNewFile();
                        
                        InputStream ins = fileItem.getInputStream();
                        OutputStream ous = new FileOutputStream(file1);
                        
                        try{
                            byte[] buffer = new byte[1024];
                            int len = 0;
                            while((len = ins.read(buffer)) > -1)
                                ous.write(buffer,0,len);
                            out.println("以保存文件"+file1.getAbsolutePath()+"<br/>");
                        }finally{
                            ous.close();
                            ins.close();
                        }
                    }
                    if("file2".equals(fileItem.getFieldName())){
                        File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8"));
                        out.println("遍歷到file2...<br/>");
                        out.println("客戶端文件位置:"+remoteFile.getAbsolutePath()+"<br/>");
                        
                        file2 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());
                        file2.getParentFile().mkdirs();
                        file2.createNewFile();
                        
                        InputStream ins = fileItem.getInputStream();
                        OutputStream ous = new FileOutputStream(file2);
                        
                        try{
                            byte[] buffer = new byte[1024];
                            int len = 0;
                            while((len = ins.read(buffer)) > -1)
                                ous.write(buffer,0,len);
                            out.println("以保存文件"+file2.getAbsolutePath()+"<br/>");
                        }finally{
                            ous.close();
                            ins.close();
                        }
                    }
                }
                out.println("Request 解析完畢<br/><br/>");
            }
        }catch(FileUploadException e){}
        
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        
        if(file1 != null){
            out.println("<div>");
            out.println(" <div align='left'>file1;</div>");
            out.println(" <div align='left'><a href='"+request.getContextPath()+"/attachment/"+
                    file1.getName()+"'target=_blank>"+file1.getName()+"</a>");
            out.println("</div>");
            out.println("</div>");
        }
        if(file2 != null){
            out.println("<div>");
            out.println(" <div align='left'>file2;</div>");
            out.println(" <div align='left'><a href='"+request.getContextPath()+"/attachment/"+
                    file2.getName()+"'target=_blank>"+file2.getName()+"</a>");
            out.println("</div>");
            out.println("</div>");
        }
        out.println("<div>");
        out.println(" <div align='left'>description1:</div>");
        out.println(" <div align='left'>");
        out.println(description1);
        out.println("</div>");
        out.println("</div>");
        
        out.println("<div>");
        out.println(" <div align='left'>description2:</div>");
        out.println(" <div align='left'>");
        out.println(description2);
        out.println("</div>");
        out.println("</div>");
        
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }

    /**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
    }

}
複製代碼

運行示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章