在Sevlet 3 以前,Servlet API中沒有支持上傳功能的API,因此要實現上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的文件,我們推薦使用Apache的commons-fileupload。
從Servlet 3開始,文件上傳變得無比簡單,相信看看下面的例子一切都清楚了。
上傳頁面index.jsp:
<%@ page pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Photo Upload</title>
</head>
<body>
<h1>Select your photo and upload</h1>
<hr/>
<div style="color:red;font-size:14px;">${hint}</div>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
Photo file: <input type="file" name="photo" />
<input type="submit" value="Upload" />
</form>
</body>
</html>
支持上傳的Servlet:
package com.jackfrued.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 可以用request.getPart()方法獲得名為photo的上傳附件
// 也可以用request.getParts()獲得所有上傳附件(多文件上傳)
// 然后通過循環分別處理每一個上傳的文件
Part part = request.getPart("photo");
if (part != null && part.getSubmittedFileName().length() > 0) {
// 用ServletContext對象的getRealPath()方法獲得上傳文件夾的絕對路徑
String savePath = request.getServletContext().getRealPath("/upload");
// Servlet 3.1規范中可以用Part對象的getSubmittedFileName()方法獲得上傳的文件名
// 更好的做法是為上傳的文件進行重命名(避免同名文件的相互覆蓋)
part.write(savePath + "/" + part.getSubmittedFileName());
request.setAttribute("hint", "Upload Successfully!");
} else {
request.setAttribute("hint", "Upload failed!");
}
// 跳轉回到上傳頁面
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
