一般我們常見的HTML輸入型態(例如:text、radio、select…)都是使用「application/x-www-form-urlencoded」的編碼方式,但要傳送檔案至伺服端時,編碼方式則是要仰賴「multipart/form-data」,由於兩者的編碼方式不同,所以這裡提供一個「FileUpload」的小範例~
必要的package如下:
HTML
<%@page language="java" contentType="text/html;charset=utf-8"%> <html> <head> <title>檔案上傳</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <b>檔案上傳</b></font></p> <form name="UploadForm" enctype="multipart/form-data" method="post" action="fileupload.dan"> <input type="file" name="File1" size="20" maxlength="20"> <br> <input type="text" name="File2" size="20" maxlength="20"> <br> <input type="submit"value="上傳"> </form> </body> </html>
Servlet
import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUpload extends HttpServlet { private String base; public void init(ServletConfig sc) throws ServletException { ServletContext sco = sc.getServletContext(); base = sco.getRealPath("/"); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { boolean isMultipart = ServletFileUpload.isMultipartContent(req); try { if(isMultipart) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); factory.setRepository(new File(base+"temp")); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(10000000); List items = upload.parseRequest(req); Iterator iter = items.iterator(); while(iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString(); System.out.println("name:"+name+" value:"+value); } else { String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); System.out.println("fieldName:"+fieldName+" fileName:"+fileName); File to = new File(base+"upload",fileName); item.write(to); } } } } catch (Exception e) { e.printStackTrace(); } } }
站長你好啊..
這個範例不錯用..
但請問有沒有辦法在html裡...
加入一次可以選多個檔案的標籤...
這樣servlet就可以連續處理多個檔案了???
2008-06-19 17:38:19
謝謝,你指的是多檔上傳嗎?
網路上有許多類似的相關範例~
http://www.blogjava.net/sitinspring/archive/2008/04/12/192408.html
參考看看~
2008-06-19 18:37:20