java 文件上传 jar_JavaWeb 之 使用 commons-fileupload.jar 实现文件上传
一、文件上傳
文件的上傳和下載,是非常常見的功能,在很多的系統中,或軟件中都經常使用文件的上傳和下載
文件的上傳主要分為下面幾步:
1、前臺頁面需要一個 form 標簽,里面的 method 為 post 請求;
2、在 form 標簽必須添加 encType屬性,且屬性值必須是 multipart/form-data值;
3、在 form 標簽中使用 input type=file 添加上傳的文件;
4、在服務器編寫代碼(Servlet程序)接收,處理上傳的數據。
注意點:
1. 請求必須是 post,因為 get 請求有長度限制;
2. encType=multipart/form-data 表示提交的數據,是以多段(每一個表單項一個數據段)的形式進行拼接,然后以二進制流的形式發送給服務器的;
3. 在服務器端必須以流的方式接收數據;
二、文件上傳之 HTTP 協議的說明
三、Commons-fileupload.jar 常用 API
注意:commons-fileupload.jar 包需要依賴 commons-io.jar這個包,所以需要在項目中引入兩個包。
1、常用API
FileItemFactory 表單項工廠接口
ServletFileUpload 文件上傳類,用于解析上傳的數據
FileItem 表單項類,表示每一個表單項
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request) 判斷當前上傳的數據格式是否是多段的格式,只有是多段數據,才能使用該方式
public List parseRequest(HttpServletRequest request) 解析上傳的數據,返回包含 表單項的 List 集合
boolean FileItem.isFormField() 判斷當前這個表單項,是否是普通的表單項,還是上傳的文件類型,true 表示普通類型的表單項;false 表示上傳的文件類型
String FileItem.getFieldName() 獲取表單項的 name 屬性值
String FileItem.getString() 獲取當前表單項的值;
String FileItem.getName() 獲取上傳的文件名
void FileItem.write( file ) 將上傳的文件寫到 參數 file 所指向存取的硬盤位置
2、流程圖
四、案例
上傳文件的表單:
1
2 用戶名:
3 照片:
4
5
解析上傳的數據的 Servlet
1 importorg.apache.commons.fileupload.FileItem;2 importorg.apache.commons.fileupload.FileItemFactory;3 importorg.apache.commons.fileupload.disk.DiskFileItemFactory;4 importorg.apache.commons.fileupload.servlet.ServletFileUpload;5
6 importjavax.servlet.ServletException;7 importjavax.servlet.http.HttpServlet;8 importjavax.servlet.http.HttpServletRequest;9 importjavax.servlet.http.HttpServletResponse;10 importjava.io.File;11 importjava.io.IOException;12 importjava.util.List;13
14 public class UploadServlet extendsHttpServlet {15 protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {16 //解決中文亂碼
17 request.setCharacterEncoding("UTF-8");18
19 //1. 先判斷上傳的的數據是否多段數據(只有是多段的數據,才是文件上傳的)
20 if( ServletFileUpload.isMultipartContent(request) ) {21
22 //創建 FileItemFactory 工廠實現類
23 FileItemFactory fileItemFactory = newDiskFileItemFactory();24 //2. 創建用于解析上傳數據的工具類
25 ServletFileUpload servletFileUpload = newServletFileUpload(fileItemFactory);26
27 try{28 //3. 解析 上傳的數據,得到每一個表單項 FiltItem
29 List list =servletFileUpload.parseRequest(request);30
31 //循環判斷,每一個表單項,是普通類型,還是上傳的文件
32 for(FileItem fileItem : list) {33
34 //是普通表單項
35 if( fileItem.isFormField() ) {36 String fieldName =fileItem.getFieldName();37 String value = fileItem.getString("UTF-8");38
39 System.out.println("表單項的name屬性值 = " +fieldName);40 System.out.println("表單項的value屬性值 = " +value);41 } else{42 //是上傳的文件
43 String name =fileItem.getFieldName();44 String fieldName =fileItem.getName();45
46 System.out.println("表單項的name屬性值 = " +name);47 System.out.println("上傳的文件名 = " +fieldName);48
49 //將數據寫到指定的位置
50 fileItem.write(new File( "F:\\" +fileItem.getName()));51 }52 }53
54 } catch(Exception e) {55 e.printStackTrace();56 }57
58 }59
60
61 }
注意:
這樣的上傳還有一個小問題,當上傳多個同名同類型的文件時,后上傳的文件會覆蓋掉原來上傳的文件,為了解決這一問題,可以在文件名前面加入當前時間的毫秒值即可。
防止文件覆蓋,將數據存儲可改成下面這種寫法:
fileItem.write(new File( "F:\\" + System.currentTimeMillis() + fileItem.getName()));
總結
以上是生活随笔為你收集整理的java 文件上传 jar_JavaWeb 之 使用 commons-fileupload.jar 实现文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的model层实例_Struts
- 下一篇: php mysql 正则表达式_MYSQ