java 文件上传 jar_JavaWeb 之 使用 commons-fileupload.jar 实现文件上传
一、文件上傳
文件的上傳和下載,是非常常見的功能,在很多的系統(tǒng)中,或軟件中都經(jīng)常使用文件的上傳和下載
文件的上傳主要分為下面幾步:
1、前臺(tái)頁面需要一個(gè) form 標(biāo)簽,里面的 method 為 post 請(qǐng)求;
2、在 form 標(biāo)簽必須添加 encType屬性,且屬性值必須是 multipart/form-data值;
3、在 form 標(biāo)簽中使用 input type=file 添加上傳的文件;
4、在服務(wù)器編寫代碼(Servlet程序)接收,處理上傳的數(shù)據(jù)。
注意點(diǎn):
1. 請(qǐng)求必須是 post,因?yàn)?get 請(qǐng)求有長(zhǎng)度限制;
2. encType=multipart/form-data 表示提交的數(shù)據(jù),是以多段(每一個(gè)表單項(xiàng)一個(gè)數(shù)據(jù)段)的形式進(jìn)行拼接,然后以二進(jìn)制流的形式發(fā)送給服務(wù)器的;
3. 在服務(wù)器端必須以流的方式接收數(shù)據(jù);
二、文件上傳之 HTTP 協(xié)議的說明
三、Commons-fileupload.jar 常用 API
注意:commons-fileupload.jar 包需要依賴 commons-io.jar這個(gè)包,所以需要在項(xiàng)目中引入兩個(gè)包。
1、常用API
FileItemFactory 表單項(xiàng)工廠接口
ServletFileUpload 文件上傳類,用于解析上傳的數(shù)據(jù)
FileItem 表單項(xiàng)類,表示每一個(gè)表單項(xiàng)
boolean ServletFileUpload.isMultipartContent(HttpServletRequest request) 判斷當(dāng)前上傳的數(shù)據(jù)格式是否是多段的格式,只有是多段數(shù)據(jù),才能使用該方式
public List parseRequest(HttpServletRequest request) 解析上傳的數(shù)據(jù),返回包含 表單項(xiàng)的 List 集合
boolean FileItem.isFormField() 判斷當(dāng)前這個(gè)表單項(xiàng),是否是普通的表單項(xiàng),還是上傳的文件類型,true 表示普通類型的表單項(xiàng);false 表示上傳的文件類型
String FileItem.getFieldName() 獲取表單項(xiàng)的 name 屬性值
String FileItem.getString() 獲取當(dāng)前表單項(xiàng)的值;
String FileItem.getName() 獲取上傳的文件名
void FileItem.write( file ) 將上傳的文件寫到 參數(shù) file 所指向存取的硬盤位置
2、流程圖
四、案例
上傳文件的表單:
1
2 用戶名:
3 照片:
4
5
解析上傳的數(shù)據(jù)的 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. 先判斷上傳的的數(shù)據(jù)是否多段數(shù)據(jù)(只有是多段的數(shù)據(jù),才是文件上傳的)
20 if( ServletFileUpload.isMultipartContent(request) ) {21
22 //創(chuàng)建 FileItemFactory 工廠實(shí)現(xiàn)類
23 FileItemFactory fileItemFactory = newDiskFileItemFactory();24 //2. 創(chuàng)建用于解析上傳數(shù)據(jù)的工具類
25 ServletFileUpload servletFileUpload = newServletFileUpload(fileItemFactory);26
27 try{28 //3. 解析 上傳的數(shù)據(jù),得到每一個(gè)表單項(xiàng) FiltItem
29 List list =servletFileUpload.parseRequest(request);30
31 //循環(huán)判斷,每一個(gè)表單項(xiàng),是普通類型,還是上傳的文件
32 for(FileItem fileItem : list) {33
34 //是普通表單項(xiàng)
35 if( fileItem.isFormField() ) {36 String fieldName =fileItem.getFieldName();37 String value = fileItem.getString("UTF-8");38
39 System.out.println("表單項(xiàng)的name屬性值 = " +fieldName);40 System.out.println("表單項(xiàng)的value屬性值 = " +value);41 } else{42 //是上傳的文件
43 String name =fileItem.getFieldName();44 String fieldName =fileItem.getName();45
46 System.out.println("表單項(xiàng)的name屬性值 = " +name);47 System.out.println("上傳的文件名 = " +fieldName);48
49 //將數(shù)據(jù)寫到指定的位置
50 fileItem.write(new File( "F:\\" +fileItem.getName()));51 }52 }53
54 } catch(Exception e) {55 e.printStackTrace();56 }57
58 }59
60
61 }
注意:
這樣的上傳還有一個(gè)小問題,當(dāng)上傳多個(gè)同名同類型的文件時(shí),后上傳的文件會(huì)覆蓋掉原來上傳的文件,為了解決這一問題,可以在文件名前面加入當(dāng)前時(shí)間的毫秒值即可。
防止文件覆蓋,將數(shù)據(jù)存儲(chǔ)可改成下面這種寫法:
fileItem.write(new File( "F:\\" + System.currentTimeMillis() + fileItem.getName()));
總結(jié)
以上是生活随笔為你收集整理的java 文件上传 jar_JavaWeb 之 使用 commons-fileupload.jar 实现文件上传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的model层实例_Struts
- 下一篇: java 线程安全的原因_Java并发编