Servlet自學之旅(9):檔案上傳
阿新 • • 發佈:2019-02-15
Servlet 檔案上傳
通過HTML的form標籤,Servlet可以讓我們將檔案上傳到伺服器,包括文字檔案,圖片等形式的文件。
建立上傳檔案的表單
首先要建立一個jsp檔案來上傳表單,表單的相關屬性需要符合以下幾點:
- method屬性應設定為POST,不可使用GET
- enctype屬性應設定為multipart/form-data.
- action屬性應設定為在伺服器上負責處理檔案上傳的Servlet。
- 上傳單個檔案 使用單個 < input type=”file”…./>標籤 ,多檔案上傳需要不同name的< input…/>,瀏覽器會為每個標籤關聯一個瀏覽按鈕。
uploade.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
<title>檔案上傳</title>
</head>
<body>
<h1>檔案上傳</h1>
<form action="/UploadFile/UploadServlet" enctype="multipart/form-data">
選擇上傳的:
<input type="file" name="uploadOne"/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
建立接收檔案的Servlet
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 接收後文件的儲存目錄
private static final String UPLOAD_DIR = "upload";
// 記憶體臨界值 - 超過後將產生臨時檔案並存儲於臨時目錄中
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
// 上傳檔案的最大值
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
// 單次請求所包含的最大值 (上傳的檔案和表單等其他資料)
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
public UploadServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 檢測是否是多媒體上傳
if (!ServletFileUpload.isMultipartContent(request)) {
// 不是的話就return,不進行之後接收上傳檔案的操作
return;
}
// 設定上傳相關的引數
DiskFileItemFactory dItemFactory = new DiskFileItemFactory();
dItemFactory.setSizeThreshold(MEMORY_THRESHOLD);
// 設定臨時儲存目錄
dItemFactory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(dItemFactory);
upload.setFileSizeMax(MAX_FILE_SIZE);
upload.setSizeMax(MAX_REQUEST_SIZE);
upload.setHeaderEncoding("UTF-8");
// String uploadPath = request.getServletContext().getRealPath("./") + UPLOAD_DIR;
// this.getServletConfig().getServletContext().getRealPath("/");
// request.getServletContext().getRealPath("/");
//檔案存放的地址,上面註釋的地址是Eclipse中獲取的專案絕對地址:
//G:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\專案名
//這個地址太深,不便檢視,擷取.metadata前的地址,放在專案檔案的目錄下。
//以下地址:G:\workspace\UpLoadFile\WebContent\upload
String t = Thread.currentThread().getContextClassLoader().getResource("").getPath();
int num = t.indexOf(".metadata");
String uploadPath = t.substring(1, num).replace('/', '\\') + "UploadFile\\WebContent\\" + UPLOAD_DIR;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
try {
@SuppressWarnings("unchecked")
Map<String, List<FileItem>> fileMap = upload.parseParameterMap(request);
fileMap.entrySet();
Iterator iterator = fileMap.entrySet().iterator();
if (iterator.hasNext()) {
Map.Entry entry = (Entry) iterator.next();
List<FileItem> fileItems = (List<FileItem>) entry.getValue();
for (FileItem item : fileItems) {
//對傳入的非 簡單的字串進行處理,即獲取非表單欄位的 ,比如說二進位制的 圖片,電影這些
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
// 在控制檯輸出檔案的上傳路徑
System.out.println("上傳成功");
System.out.println(filePath);
// 儲存檔案到硬碟
item.write(storeFile);
}
}
}
} catch (FileUploadException e) {
System.out.println("上傳失敗");
e.printStackTrace();
} catch (Exception e) {
System.out.println("上傳失敗");
e.printStackTrace();
}
}
}