Commons FileUpLoad 兩種上傳方式解
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 大小