<%@ page contentType="text/html;charset=UTF-8" %>
<HTML>
<HEAD>
<title>上傳文件</title>
</HEAD>
<body>
<div>
<form action="upFile.do" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>姓名</td>
<td><input name="name" type="text"></td>
<td>年齡</td>
<td><input name="age" type="text"></td>
<td>上傳文件</td>
<td><input name="file" type="file"></td>
<td><input type="submit" value="上傳"></td>
</tr>
</table>
</form>
</div>
</body>
</HTML>
核心API—DiskFileItemFactory
DiskFileItemFactory 是創建FileItem 對象的工廠,這個工廠類常用方法:
1、public void setSizeThreshold(int sizeThreshold) :設置內存緩沖區的大小,默認值為10K。當上傳文件大於緩沖區大小時,fileupload組件將使用臨時文件緩存上傳文件。
2、public void setRepository(Java.io.File repository) :指定臨時文件目錄,默認值為System.getProperty(“java.io.tmpdir”).
3、public DiskFileItemFactory(int sizeThreshold,java.io.File repository) :構造函數
核心API—-ServletFileUpload
ServletFileUpload 負責處理上傳的文件數據,並將表單中每個輸入項封裝成一個FileItem 對象中。常用方法有:
1、boolean isMultipartContent(HttpServletRequest request) :判斷上傳表單是否為multipart/form-data類型
2、List parseRequest(HttpServletRequest request):解析request對象,並把表單中的每一個輸入項包裝成一個fileItem 對象,並返回一個保存了所有FileItem的list集合。
3、setFileSizeMax(long fileSizeMax) :設置上傳文件的最大值(單個文件),用於設置單個上傳文件的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節為單位的long型數字。
4、setSizeMax(long sizeMax) :設置上傳文件總量的最大值(所有上傳文件),用於設置請求消息實體內容(即所有上傳數據)的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節為單位的long型數字。
5、setHeaderEncoding(java.lang.String encoding) :設置編碼格式。在文件上傳請求的消息體中,除了普通表單域的值是文本內容以外,文件上傳字段中的文件路徑名也是文本,在內存中保存的是它們的某種字符集編碼的字節數組,Apache文件上傳組件在讀取這些內容時,必須知道它們所采用的字符集編碼,才能將它們轉換成正確的字符文本返回。
核心API—FileItem
FileItem類的常用方法:
1、boolean isFormField(): isFormField方法用於判斷FileItem類對象封裝的數據是一個普通文本表單字段,還是一個文件表單字段,如果是普通表單字段則返回true,否則返回false。
2、 String getName()
用於獲得文件上傳字段中的文件名。注意IE或FireFox中獲取的文件名是不一樣的,IE中是絕對路徑,FireFox中只是文件名。
3、String getFieldName()
用於返回表單標簽name屬性的值。
4、 void write(File file):用於將FileItem對象中保存的主體內容保存到某個指定的文件中。如果FileItem對象中的主體內容是保存在某個臨時文件中,該方法順利完成后,臨時文件有可能會被清除。該方法也可將普通表單字段內容寫入到一個文件中,但它主要用途是將上傳的文件內容保存在本地文件系統中。
5、 String getString():用於將FileItem對象中保存的數據流內容以一個字符串返回,它有兩個重載的定義形式:
public Java.lang.String getString();
public java.lang.String getString(java.lang.String encoding) throws java.io.UnsupportedEncodingException
前者使用缺省的字符集編碼將主體內容轉換成字符串,后者使用參數指定的字符集編碼將主體內容轉換成字符串。如果在讀取普通表單字段元素的內容時出現了中文亂碼現象,請調用第二個getString方法,並為之傳遞正確的字符集編碼名稱。
6、 void delete():delete方法用來清空FileItem類對象中存放的主體內容,如果主體內容被保存在臨時文件中,delete方法將刪除該臨時文件。盡管當FileItem對象被垃圾收集器收集時會自動清除臨時文件,但及時調用delete方法可以更早的清除臨時文件,釋放系統存儲資源。
實現步驟:
1、創建DiskFileItemFactory對象,設置緩沖區大小和臨時文件目錄。
2、使用DiskFileItemFactory 對象創建ServletFileUpload對象,並設置上傳文件的大小限制。
3、調用ServletFileUpload.parseRequest方法解析request對象,得到一個保存了所有上傳內容的List對象。
4、對list進行迭代,每迭代一個FileItem對象,調用其isFormField方法判斷是否是上傳文件:
4.1、 為普通表單字段,則調用getFieldName、getString方法得到字段名和字段值。
4.2、為上傳文件,則調用getInputStream方法得到數據輸入流,從而讀取上傳數據。
需要引入的jar包:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
代碼實現:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
//創建一個解析器工廠
DiskFileItemFactory factory=new DiskFileItemFactory();
//設置工廠的內存緩沖區大小,默認是10K
// factory.setSizeThreshold(1024*1024);
//設置工廠的臨時文件目錄:當上傳文件的大小大於緩沖區大小時,將使用臨時文件目錄緩存上傳的文件
factory.setRepository(new File("D:\\YOHO\\"));
//文件上傳解析器
ServletFileUpload upload=new ServletFileUpload(factory);
//設置所有上傳數據的最大值,單位字節long 1M
upload.setSizeMax(1024*1024);
//設置單個文件上傳的最大值
upload.setFileSizeMax(1024*1024);
//設置編碼格式
upload.setHeaderEncoding("UTF-8");
try {
//解析請求,將表單中每個輸入項封裝成一個FileItem對象
List<FileItem> itemList=upload.parseRequest(request);
for(FileItem item:itemList){
//判斷輸入的類型是 普通輸入項 還是文件
if(item.isFormField()){
//普通輸入項 ,得到input中的name屬性的值
String name=item.getFieldName();
//得到輸入項中的值
String value=item.getString("UTF-8");
System.out.println("name="+name+" value="+value);
}else{
//上傳的是文件,獲得文件上傳字段中的文件名
//注意IE或FireFox中獲取的文件名是不一樣的,IE中是絕對路徑,FireFox中只是文件名。
String fileName=item.getName();
System.out.println(fileName);
//返回表單標簽name屬性的值
String namede=item.getFieldName();
System.out.println(namede);
//方法一:保存上傳文件到指定的文件路徑
InputStream is=item.getInputStream();
FileOutputStream fos=new FileOutputStream("D:\\wps\\"+fileName);
byte[] buff=new byte[1024];
int len=0;
while((len=is.read(buff))>0){
fos.write(buff);
}
//方法二:保存到指定的路徑
//將FileItem對象中保存的主體內容保存到某個指定的文件中。
// 如果FileItem對象中的主體內容是保存在某個臨時文件中,該方法順利完成后,臨時文件有可能會被清除
item.write(new File("D:\\sohucache\\"+fileName));
is.close();
fos.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//結果:
//普通文本
name=name value=我等着
name=age value=25
//文件名 :火狐瀏覽器是 文件名,,IE瀏覽器是絕對路徑
asosResult.txt
//jsp中name屬性的值
file
原文:https://blog.csdn.net/u014785687/article/details/73863964
