沒有針對Servlet3.1 說明,請具體看代碼說明
沒有進行任何封裝和代碼的優化
只是體會上傳的不同而已
<form action="uploadFile" method="post" enctype="multipart/form-data">
<input type="file" name="photo">
<button>上傳</button>
</form>
package com.shxt.servlet;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
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;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/uploadFile")
@MultipartConfig(
fileSizeThreshold=1024*1024*2, // 2MB 當數據量大于該值時,內容將被寫入文件
maxFileSize=1024*1024*10, // 10MB 允許上傳的文件最大值。默認值為 -1,表示沒有限制
maxRequestSize=1024*1024*50 // 50MB 針對該 multipart/form-data 請求的最大數量,默認值為 -1,表示沒有限制
)
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.獲取服務器的絕對路徑
String path = request.getServletContext().getRealPath("/upload");
//2.建立文件聯系
File folder = new File(path);
//3.判斷該文件夾是否存在
if(!folder.exists()/*文件是否存在*/&&!folder.isDirectory()/*是否是文件夾*/){
folder.mkdirs();//創建
}
//4.獲取上傳的文件 <input type="file" name="photo">
Part part = request.getPart("photo");
//5.獲取客戶端文件的名稱
//獲取文件名稱:
//Servlet3.0 沒有提供直接獲取文件的名稱 , 所以需要讀取頭部信息獲取文件名 - Tomcat 7
//Servlet 3.1 增加了新的方法 Part.getSubmittedFileName,用于取得客戶端上傳的文件名。 - Tomcat 8
String clientFileName = extractFileName(part);
//5.1 判斷客戶端是否傳遞數據
if(!clientFileName.isEmpty()){
//6.獲取客戶端的后綴名稱
String ext = clientFileName.substring(clientFileName.lastIndexOf(".")+1);
//7.創建上傳文件的名稱[新文件名稱]
//方式一:
String uploadNewFileName = (new Date()).getTime()+"_"+(new Random()).nextInt(1000)+"."+ext;
//方式二:
//String uploadNewFileName = UUID.randomUUID().toString()+ext;
//8.上傳文件
part.write(path+File.separator+uploadNewFileName);
}
}
/**
* 從 HTTP header content-disposition中獲得文件名
* content-disposition中內容:form-data; name="dataFile"; filename="PHOTO.JPG"
*/
private String extractFileName(Part part) {
String contentDisp = part.getHeader("content-disposition");
String[] items = contentDisp.split(";");
for (String s : items) {
if (s.trim().startsWith("filename")) {
return s.substring(s.indexOf("=") + 2, s.length()-1);
}
}
return "";
}
}