1. 程式人生 > >每天學習一個小功能:java文件上傳

每天學習一個小功能:java文件上傳

set 下載 nts null 最大的 上傳文件 getname response 完整

====(1、)第一種、利用普通緩沖流進行文件上傳

① 前端

註意:

1、指定表單類型為文件上傳表單 :enctype="multipart/form-data"
2、提交方式必須為:post
3、表單中,存在文件域 的表單元素

<form name="frm_test" action="${pageContext.request.contextPath }/shangchuan" method="post" enctype="multipart/form-data">
<%--<input type="hidden" name="method" value="upload">--%>

用戶名:<input type="text" name="userName"> <br/>
文件: <input type="file" name="file_img"> <br/>

<input type="submit" value="提交">
</form>

②後臺

註意:

request.getQueryString();//獲取get提交的數據
request.getInputStream();//獲取post提交的數據,post請求以流的形式發送,(inputstream)

@RequestMapping("shangchuan")
public String shangChuan(HttpServletRequest request,HttpServletResponse respose) throws ServletException,IOException{
//獲取表單(POST)數據
InputStream in=request.getInputStream();
//轉換流
InputStreamReader inReader=new InputStreamReader(in);
//緩沖流
BufferedReader reader=new BufferedReader(inReader);
//遍歷
String str=null;
while((str=reader.readLine())!=null){
System.out.println("-=------------------------------------------------"+str);
//解析上傳的數據
}

return null;
}

====(2、)第二種、FileUpload組件(上傳組件)! apache提供的開源項目!

備註:

*******************************************************
1、下載組件;引入jar文件
commons-fileupload-1.2.1
commons-io-1.4
2、配置(prop/xml)
3、FileUpload 的api學習

* ① FileFactory 文件上傳工廠類(把每一個請求封裝為一個個FileItem對象)
* fileItemFactory.setRepository(repository) 設置文件上傳臨時路徑(有默認)
*
* ② ServletFileUpload 文件上傳核心類
* List = upload.parseRequest(request)
* upload.isMultipartContent(request) 判斷表單類型:文件上傳表單
* // 一、設置單個文件允許的最大的大小: 30M
upload.setFileSizeMax(30*1024*1024);
// 二、設置文件上傳表單允許的總大小: 80M
upload.setSizeMax(80*1024*1024);
// 三、 設置上傳表單文件名的編碼
// 相當於:request.setCharacterEncoding("UTF-8");
upload.setHeaderEncoding("UTF-8") 相當於request.setContentType(..);
③ FileItem 封裝了普通表單項的值以及文件上傳表單元素值
item.getFileName() 獲取上傳表單元素名稱
item.getString() 獲取上傳數據
item.getString("UTF-8") 獲取上傳數據,處理中文亂碼
item.getContentype() 獲取上傳文件類型【文件項】
item.getInputStream() 獲取文件流【文件項】
item.getName(); 獲取文件名【文件項】
item.write(new File("文件路徑")); 把文件寫入指定目錄
item.delete 刪除臨時文件
*/
*******************************************************

* ##################################
!!!!! 本功能的需求:!!!!!
* 實現一個完整的文件上傳
* 1、設置單個文件不能超過30M
* 2、設置總大小不能超過50M
* 3、上傳目錄,上傳到項目資源目錄下的upload目錄下
* 4、上傳文件不能覆蓋,解決上傳文件文件名不重名問題
* ##################################
@RequestMapping("shangchuan")
public String FileUpload(HttpServletRequest request,HttpServletResponse respose) throws ServletException,IOException{
//1、創建文件上傳工場類
FileItemFactory fileItemFactory=new DiskFileItemFactory();

//2、創建文件上傳核心類對象
ServletFileUpload upload=new ServletFileUpload(fileItemFactory);
//upload.setFileItemFactory(fileItemFactory);
//【一、設置單個文件最大:30M】
upload.setFileSizeMax(30*1024*1024);//30M
//【二、設置總文件大小:50M】
upload.setSizeMax(50*1024*1024);
//3、判斷當前表單是否為文件上傳表單
if(upload.isMultipartContent(request)){
//4、把請求數據轉換為FileItem對象集合*(FileItem代表每一個上傳主鍵)
try {
List<FileItem> list=upload.parseRequest(request);
//5、遍歷,得到每一個上傳項
for(FileItem item:list){
//6、遍歷時要判斷是普通表單還是文件上傳的數據
if(item.isFormField()){
//普通表單
//獲取元素名稱
String fileName=item.getFieldName();
//獲取值
String value=item.getString("UTF-8");

System.out.println(fileName+value);
}else{
//文件上傳表單(對應前端 type=file)
/******** 文件上傳 ***********/
//處理文件上傳

//獲取文件名
String name=item.getName();
//重新生成文件名

//獲取上傳的目錄路徑
String basePath=request.getSession().getServletContext().getRealPath("/upload");
//創建文件對象
File file =new File(basePath,name);
//寫入文件
item.write(file);
item.delete();//刪除臨時文件
}


}


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}else{
System.out.println("當前表單不是文件上傳表單,不處理");
}
return null;
}

每天學習一個小功能:java文件上傳