Servlet實現文件上傳與下載
所需包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar-
核心類:
DiskFileItemFactory
是創建FileItem對象的工廠包括方法:
1.public void setSizeThreshold(int?sizeThreshold)
設置內存緩沖區的大小,默認值為10K,如果文件大于10K,將使用臨時文件緩存上傳文件.
2.public void setRepository(Java.io.File repository)
指定臨時文件目錄3.public DiskFileItemFactory();
ServletFileUpload
ServletFileUpload負責處理上傳的文件數據,并將表單中每個輸入項封裝成一個FileItem對象中.
- public void setSizeMax(long sizeMax)
用于設置請求消息實體內容(即所有上傳數據)的最大尺寸限制。 - public void setFileSizeMax(long fileSizeMax)
用于設置單個上傳文件的最大尺寸限制。 - public List parseRequest(javax.servlet.http.HttpServletRequest req)
它是對HTTP請求消息體內容進行解析的入口方法。它解析出FORM表單中的每個字段的數據,并將它們分別包裝成獨立的FileItem對象,然后將這些FileItem對象加入進一個List類型的集合對象中返回。 - public FileItemIterator getItemIterator(HttpServletRequest request)
getItemIterator方法和parseRequest 方法基本相同。但是getItemIterator方法返回的是一個迭代器。 - public stiatc boolean isMultipartContent(HttpServletRequest req)
isMultipartContent方法方法用于判斷請求消息中的內容是否是“multipart/form-data”類型。 - getFileItemFactory()和setFileItemFactory(FileItemFactory)
方法繼承自FileUpload類,用于設置和讀取fileItemFactory屬性。 - public void setProgressListener(ProgressListener pListener)
設置文件上傳進度監聽器。該方法有一個對應的讀取方法:ProgressListener getProgressListener()。 - public void setHeaderEncoding()
Apache文件上傳組件在讀取這些內容時,必須知道它們所采用的字符集編碼,才能將它們轉換成正確的字符文本返回。
FileItem
- boolean isFormField()
isFormField方法用于判斷FileItem類對象封裝的數據是一個普通文本表單字段,還是一個文件表單字段。 - String getName()
getName方法用于獲得文件上傳字段中的文件名。(有的瀏覽器獲得的是瀏覽器,有的是絕對路徑) - String getFieldName()
getFieldName方法用于返回表單標簽name屬性的值。 - void write(File file)
write方法用于將FileItem對象中保存的主體內容保存到某個指定的文件中。 - String getString()
getString方法用于將FileItem對象中保存的數據流內容以一個字符串返回,它有兩個重載的定義形式: - String getContentType()
getContentType 方法用于獲得上傳文件的類型,即表單字段元素描述頭屬性“Content-Type”的值。 - boolean isInMemory()
判斷FileItem對象封裝的數據內容是存儲在內存中true,還是存儲在臨時文件中false。 - void delete()
delete方法用來清空FileItem類對象中存放的主體內容,如果主體內容被保存在臨時文件中,delete方法將刪除該臨時文件。 - InputStream getInputStream()
以流的形式返回上傳文件的數據內容。 - long getSize()
返回該上傳文件的大小(以字節為單位)。
- public void setSizeMax(long sizeMax)
文件上傳
- 表單的提交方式必須為post
- enctype="multipart/form-data"屬性
<center>
<form action="${pageContext.request.contextPath }/up_load" method="post" enctype="multipart/form-data">
請選擇上傳文件<input type="file" name="file" ><br>
<input type="submit" value="上傳">
</form>
</center>
- web.xml配置
<!-- 文件上傳 -->
<servlet>
<servlet-name>load</servlet-name>
<servlet-class>cn.hsx.edu.up_down.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>load</servlet-name>
<url-pattern>/up_load</url-pattern>
</servlet-mapping>
- Servelt類
package cn.hsx.edu.up_down;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet文件上傳
* @author ssk
*
*/
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/********* 文件上傳組件: 處理文件上傳 ************/
try {
System.out.println("開始處理文件上傳 ");
// 1. 文件上傳工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2. 創建文件上傳核心工具類
ServletFileUpload upload = new ServletFileUpload(factory);
// 一、設置單個文件允許的最大的大小: 30M
upload.setFileSizeMax(30 * 1024 * 1024);
// 二、設置文件上傳表單允許的總大小: 50M
upload.setSizeMax(50 * 1024 * 1024);
// 三、 設置上傳表單文件名的編碼
// 相當于:request.setCharacterEncoding("UTF-8");
upload.setHeaderEncoding("UTF-8");
// 3. 判斷: 當前表單是否為文件上傳表單
if (upload.isMultipartContent(request)) {
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
// 判斷:普通文本數據
if (item.isFormField()) {
String name = item.getName();// 表單元素名稱
String content = item.getString();// 表單元素名稱,對應的數據
// item.getString("UTF-8"); 指定編碼
System.out.println(name + "," + content);
}
// 上傳文件(文件流) ----> 上傳到upload目錄下
else {
// 普通文本數據
String itemName = item.getFieldName();// 表單元素名稱
String name = item.getName();// 文件名(包括路徑)
String content = item.getString();// 表單元素名稱,對應的數據
String type = item.getContentType();// 文件類型
InputStream in = item.getInputStream();// 上傳文件流
//截取文件名
name = name.substring(name.lastIndexOf("\\")+1);
/*
* 四、文件名重名 對于不同用戶readme.txt文件,不希望覆蓋! 后臺處理: 給用戶添加一個唯一標記!
*/
// a. 隨機生成一個唯一標記
String id = UUID.randomUUID().toString();
// b. 與文件名拼接
name = id + "#" + name;
// 獲取上傳路徑
String path = getServletContext().getRealPath("/upload");
// 創建目標文件
File file = new File(path, name);
// 工具類,上傳文件
item.write(file);
item.delete();// 刪除系統產生的臨時文件
System.out.println("文件上傳完畢");
}
}
} else {
System.out.println("當前表單不是文件上傳表單,處理失敗!");
}
} catch (Exception e) {
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("post收到請求,轉發給GET");
// upload(request);
this.doGet(request, response);
}
// 手動實現過程
private static void upload(HttpServletRequest request) {
/*
* request.getParameter(""); // GET/POST request.getQueryString(); // 獲取GET提交的數據
* request.getInputStream(); // 獲取post提交的數據
*/
/*********** 手動獲取文件上傳表單數據 ************/
try {
// 獲取表單數據流
InputStream in = request.getInputStream();
// 轉換流
InputStreamReader inStream = new InputStreamReader(in, "utf-8");
// 緩沖流
BufferedReader reader = new BufferedReader(inStream);
// 輸出數據
String str = "";
while ((str = reader.readLine()) != null) {
System.out.println(str);
}
// 關閉
reader.close();
inStream.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}