Commons FileUpLoad 兩種上傳方式解

jopen 11年前發布 | 66K 次閱讀 上傳 文件上傳

Commons FileUpLoad 兩種上傳方式解

traditional API (傳統方式)

//上傳路徑
File file = new File("C:/upload");
//臨時文件路徑
File tempFile = new File("C:/uploadtemp");

if(!file.exists()) { file.mkdir(); }

if(!tempFile.exists()) { tempFile.mkdir(); } //判斷 request 是一個文件上傳的 request //通過 ServletFileUpload 類的靜態方法 isMultipartContent 來判斷 if(ServletFileUpload.isMultipartContent(request)) { //用 DiskFileItemFactory 創建新的 file items (只是臨時的) //DiskFileItemFactory 創建FileItem 實例,并保存其內容在<b>內存</b>或者<b>硬盤中</b> //通過一個閥值來決定這個 FileItem 實例是存放在<b>內存</b>或者<b>硬盤中</b> DiskFileItemFactory factory = new DiskFileItemFactory(); //設置閥值大小 //不設置的話,默認10k //超過這個閥值,FileItem將直接寫入到磁盤 factory.setSizeThreshold(102410); //設置臨時文件夾 //不設置,默認為系統默認Temp文件路徑,調用 System.getProperty("java.io.tmpdir") 獲取 //超過閥值的 FileItem 實例將存放在這個目錄中 factory.setRepository(tempFile); //構造servletFileUpload 的實例,該實例提供工廠模式創建FileItem的DiskFileItemFactory實例 ServletFileUpload fileUpload = new ServletFileUpload(factory); //設置一個<b>完整的請求</b>允許的最大大小(注意是完整請求,包括非file類型的表單,比如Text類型) fileUpload.setSizeMax(1010241024); //設置所允許的最大的單個上傳文件大小(對應一個FileItem對象) //fileUpload.setFileSizeMax(101024*1024);

try {
    //每一個FileItem 對應一個 request 請求中from表單中的 input 元素
    //解析 request 請求,將request中提交的值存入List數組
    List<FileItem> items = fileUpload.parseRequest(request);

    for(FileItem item : items) {
        //是不是一個文件上傳組件
        if(!item.isFormField()) {
            String name = item.getName();
            System.out.println("name:" + name);
            System.out.println("length:" + item.getSize());
            item.write(new File("C:/upload/"+name));
        } else {
            String desc = item.getString("UTF-8");
            System.out.println("文件描述:" + desc);
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

} else { throw new RuntimeException("請設置form表單的enctype屬性"); }</pre>

Streaming API

//設置文件上傳路徑
String UploadFilePath = "d:/upload";
//限制文件大小
//通過 request.getHeader("Content-Length") 獲取request 請求內容長度來限制
if(ServletFileUpload.isMultipartContent(request)) {

//創建ServletFileUpload實例
ServletFileUpload upload = new ServletFileUpload();
try {
    //解析request 請求 并返回FileItemStream 的iterator 實例
    FileItemIterator iter = upload.getItemIterator(req);
    while (iter.hasNext()) {
        FileItemStream item = iter.next();
        String name = item.getFieldName();
        InputStream stream = item.openStream();
        if (item.isFormField()) {
            System.out.println("Form field " + name + " with value "
                    + Streams.asString(stream) + " detected.");
        } else {
            System.out.println("File field " + name + " with file name "
                    + item.getName() + " detected.");
            // Process the input stream
            //System.out.println(Streams.asString(stream));
            System.out.println("shuru:");
            String filename = new Scanner(System.in).next();
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(new File("e:/upload"),"ez.zip")));
            BufferedInputStream bis = new BufferedInputStream(stream);
            byte[] buffer = new byte[1024];
            int len = -1;
            while (-1 != (len = bis.read(buffer))){
                bos.write(buffer,0,len);
            }
            bis.close();
            bos.flush();
            bos.close();

            PrintWriter out = resp.getWriter();
            out.write("完成");
            System.out.println("wanchengle ");
        }
    }
} catch (FileUploadException e) {
    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
}

} else { throw new RuntimeException("請設置form表單的enctype屬性"); }</pre>

兩種方法對比

Streaming API 優勢:速度快消耗資源少。

Streaming API 不會保存文件到硬盤或內存,它僅僅提供一個流,你可以讀取它存放到硬盤。相比傳統的API,避免了創建臨時文件。而傳統的API需要copy兩次,一次是從瀏覽器到臨時文件,一次是從臨時文件到存放目錄。

Streaming API 缺點: 只能限制整個 request content 的大小,不能限制一次請求中單個 FileItem 大小

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!