Servlet3.0提供了對文件上傳的原生支持。
使用注解@MultipartConfig將一個Servlet標識為支持文件上傳。
Servlet3.0將multipart/form-data的POST請求封裝成Part,通過Part對上傳的文件進行操作。
上傳文件的表單:
<form action="UploadServlet" method="post" enctype="multipart/form-data"> <tr> <td> <input type="file" name="file"><br> <input type="submit"> </td> </tr> </form>
處理文件上傳的Servlet:
package com.cndatacom.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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(name="UploadServlet",urlPatterns="/UploadServlet")
@MultipartConfig//標識Servlet支持文件上傳
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//存儲路徑
String storePath = request.getServletContext().getRealPath("/uploadFile");
Part part = request.getPart("file");
//Servlet3沒有提供直接獲取文件名的方法,需要從請求頭中解析出來
//獲取請求頭
String header = part.getHeader("content-disposition");
//獲取文件名
String fileName = parseFileName(header);
//把文件寫到指定路徑
part.write(storePath+File.separator+fileName);
PrintWriter out = response.getWriter();
out.println("上傳成功");
out.flush();
out.close();
}
/**
* 根據請求頭解析出文件名
* 請求頭的格式:form-data; name="file"; filename="a.txt"
* @param header
* @return
*/
public String parseFileName(String header) {
return header.substring(header.lastIndexOf("=") + 2, header.length() - 1);
}
}
@MultipartConfig的屬性都是可選的:
fileSizeThreshold:設置閾值,達到閾值后開始把文件寫到磁盤。
location: 設置文件的存儲目錄。
maxFileSize: 允許上傳文件的最大值,Byte為單位。
maxRequestSize: multipart/form-data 請求允許的最大值。
