Servlet中的檔案上傳,Servlet檔案上傳
上傳表單中的注意事項:
表單 method 屬性應該設定為 POST 方法,不能使用 GET 方法
表單 enctype 屬性應該設定為multipart/form-data
下面的執行個體是藉助於commons-fileupload和commons-io相關包來實現的
import java.io.*;import java.util.*; import javax.servlet.ServletConfig;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.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.output.*; public class UploadServletextends HttpServlet { private boolean isMultipart; private String filePath; private int maxFileSize = 50 * 1024; private int maxMemSize = 4 * 1024; private File file ; public void init( ){ // 擷取檔案將被儲存的位置 filePath = getServletContext().getInitParameter("file-upload"); } public void doPost(HttpServletRequestrequest, HttpServletResponse response) throws ServletException,java.io.IOException { // 檢查我們有一個檔案上傳請求 isMultipart = ServletFileUpload.isMultipartContent(request); response.setContentType("text/html"); java.io.PrintWriter out =response.getWriter( ); if( !isMultipart ){ out.println("<html>"); out.println("<head>"); out.println("<title>Servletupload</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>No fileuploaded</p>"); out.println("</body>"); out.println("</html>"); return; } DiskFileItemFactoryfactory = new DiskFileItemFactory(); //設定上傳檔案時用於臨時存放檔案的記憶體大小 factory.setSizeThreshold(maxMemSize); //設定存放臨時檔案的目錄,這個目錄需要事先建立好 factory.setRepository(new File("c:\\temp")); // 建立一個新的檔案上傳處理常式 ServletFileUploadupload = new ServletFileUpload(factory); // 允許上傳的檔案大小的最大值 upload.setSizeMax( maxFileSize ); try{ // 解析請求,擷取檔案項 List fileItems = upload.parseRequest(request); // 處理上傳的檔案項 Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<head>"); out.println("<title>Servletupload</title>"); out.println("</head>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) //是檔案域 { // 擷取上傳檔案的參數 String fieldName = fi.getFieldName(); String fileName = fi.getName(); //檔案的全路徑 String contentType = fi.getContentType(); boolean isInMemory =fi.isInMemory(); long sizeInBytes = fi.getSize(); //得到去除路徑的檔案名稱 if(fileName.lastIndexOf("\\") >= 0 ){ //路徑中包含“\”時 file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))); }else{ //路徑中不包含“\”時 file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ; } fi.write( file ) ; // 寫入檔案 out.println("UploadedFilename: " + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } } public void doGet(HttpServletRequestrequest, HttpServletResponseresponse) throws ServletException,java.io.IOException { throw new ServletException("GETmethod used with " + getClass( ).getName( )+":POST method required."); }}