1. 程式人生 > >java文件上傳-使用apache-fileupload組件

java文件上傳-使用apache-fileupload組件

getprop 獲取文件 依賴包 生成 str flush array .com type

目前文件上傳的(框架)組件:Apache----fileupload 、Orialiy – COS – 2008() 、Jsp-smart-upload – 200M。

用fileupload上傳文件:

需要導入第三方包:

Apache-fileupload.jar – 文件上傳核心包。

Apache-commons-io.jar – 這個包是fileupload的依賴包。同時又是一個工具包。

使用springmvc,解決煩人的post亂碼問題,新建maven項目:

技術分享

maven依賴:

<
dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>${commons-fileupload.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId
>commons-io</artifactId> <version>${commons-io.version}</version> </dependency>
版本:

<commons-io.version>1.3.2</commons-io.version>
<commons-fileupload.version>1.3.1</commons-fileupload.version>

核心類:

DiskFileItemFactory – 設置磁盤空間,保存臨時文件。只是一個具類。

ServletFileUpload - 文件上傳的核心類,此類接收request,並解析reqeust

  ServletFileUpload.parseRequest(request); --List<FileItem> 解析request

      一個FileItem就是一個標識分隔符開始 到結束。如下圖:

技術分享

查看DiskFileItemFactory源代碼,可知

If not otherwise configured, the default configuration values are as
 follows:
   Size threshold is 10KB.
   Repository is the system default temp directory, as returned by
   System.getProperty("java.io.tmpdir")

可知,如果不設置臨時目錄,會保存在默認的臨時目錄- System.getProperty("java.io.tmpdir");這個目錄正是windows系統的臨時文件存放目錄,通過環境變量,可找到這個目錄

技術分享技術分享

這裏存放著許多臨時文件。

controller:

package com.lhy.upload.controller;

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.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.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * DiskFileItemFactory:設置磁盤空間,保存臨時文件,只是一個工具類。
 * 構造器 DiskFileItemFactory(int sizeThreshold, File repository):
 *     sizeThreshold:
 *         設置緩存保存(內存)保存多少字節數據,默認10K。
 *         如果一個文件沒有大於10K,則直接使用內存,直接保存成文件就可以了。
 *         如果一個文件大於10K,就需要將文件先保存到臨時文件中去。
 *     repository:
 *         臨時目錄的位置。
 * 
 * 
 * ServletFileUpload:文件上傳核心類,接收request 並解析。
 *
 */
@RequestMapping("/upload")
@Controller
public class UploadController {
    
    @RequestMapping("uploadFile")
    public void uploadFile(HttpServletRequest request,HttpServletResponse response){
        //獲取tomcat下的up目錄的路徑   
        String path = request.getSession().getServletContext().getRealPath("/up");
        //1,聲明DiskFileItemFactory工廠類,用於在指定磁盤上設置一個臨時目錄
        DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("F:/temp"));
        //2,聲明ServletFileUpload,接收上邊的臨時文件。也可以默認值
        ServletFileUpload up = new ServletFileUpload(disk);
        //3,解析request
        try {
            List<FileItem> list = up.parseRequest(request);
            //如果就一個文件,
            FileItem file = list.get(0);
            //獲取文件名:
            String fileName = file.getName();
            //獲取文件的類型:
            String fileType = file.getContentType();
            //獲取文件的字節碼:
            InputStream in = file.getInputStream();
            //文件大小
            int size = file.getInputStream().available();
            //聲明輸出字節流
            OutputStream out = new FileOutputStream(path+"/"+fileName);
            //文件copy
            byte[] b = new byte[1024];
            int len = 0;
            while((len=in.read(b))!=-1){
                out.write(b, 0, len);
            }
            out.flush();
            out.close();
            
            //刪除上傳生成的臨時文件
            file.delete();
            
            //顯示數據
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter pw = response.getWriter();
            pw.println("文件名:"+fileName);
            pw.println("文件類型:"+fileType);
            pw.println("<br/>文件大小(byte):"+size);
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

上傳文件:

技術分享

臨時目錄:

技術分享

服務端:

技術分享

響應:

技術分享

實際項目中都是有文件服務器的,公司一般都提供了上傳到文件服務器接口,有的是上傳一個file類型,有的是流。

多文件上傳:和單文件一樣

表單:

技術分享

controller:

/**
     * 多文件上傳
     * @param request
     * @param response
     */
    @RequestMapping("uploadMultipart")
    public void uploadMultipart(HttpServletRequest request,HttpServletResponse response){
        //獲取tomcat下的up目錄的路徑   
        String path = request.getSession().getServletContext().getRealPath("/up");
        //1,聲明DiskFileItemFactory工廠類,用於在指定磁盤上設置一個臨時目錄
        DiskFileItemFactory disk = new DiskFileItemFactory(1024*10,new File("F:/temp"));
        //2,聲明ServletFileUpload,接收上邊的臨時文件。也可以默認值
        ServletFileUpload up = new ServletFileUpload(disk);
        //3,解析request
        try {
            List<FileItem> list = up.parseRequest(request);
            for (FileItem file : list) {
                //獲取文件名:
                String fileName = file.getName();
                //獲取文件的類型:
                String fileType = file.getContentType();
                //獲取文件的字節碼:
                InputStream in = file.getInputStream();
                //使用工具類
                FileUtils.writeByteArrayToFile(new File(path+"/"+fileName), file.get());
                file.delete();
            }
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

測試,上傳3張圖片:

技術分享

技術分享

java文件上傳-使用apache-fileupload組件