java文件上傳-使用apache-fileupload組件
目前文件上傳的(框架)組件: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組件