Java, Grails, OpenSolaris, Linux, programming, skateboarding...
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>FileUploadServlet</servlet-name> <servlet-class>FileUploadServlet</servlet-class> </servlet>
<servlet-mapping> <servlet-name>FileUploadServlet</servlet-name> <url-pattern>/FileUploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>upload.html</welcome-file> </welcome-file-list> </web-app>
import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List;
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.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
public FileUploadServlet() { super(); }
public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your code here }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); }
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final long MAX_SIZE = 3 * 1024 * 1024;// 設置上傳文件最大為 3M // 允許上傳的文件格式的列表 final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt", "doc", "docx", "mp3", "wma", "m4a" }; response.setContentType("text/html"); // 設置字符編碼為UTF-8, 這樣支持漢字顯示 response.setCharacterEncoding("UTF-8");
// 實例化一個硬盤文件工廠,用來配置上傳組件ServletFileUpload DiskFileItemFactory dfif = new DiskFileItemFactory(); dfif.setSizeThreshold(4096);// 設置上傳文件時用于臨時存放文件的內存大小,這里是4K.多于的部分將臨時存在硬盤 dfif.setRepository(new File(request.getRealPath("/") + "ImagesUploadTemp"));// 設置存放臨時文件的目錄,web根目錄下的ImagesUploadTemp目錄
// 用以上工廠實例化上傳組件 ServletFileUpload sfu = new ServletFileUpload(dfif); // 設置最大上傳尺寸 sfu.setSizeMax(MAX_SIZE);
PrintWriter out = response.getWriter(); // 從request得到 所有 上傳域的列表 List fileList = null; try { fileList = sfu.parseRequest(request); } catch (FileUploadException e) {// 處理文件尺寸過大異常 if (e instanceof SizeLimitExceededException) { out.println("文件尺寸超過規定大小:" + MAX_SIZE + "字節<p />"); out.println("<a href=\"upload.html\" target=\"_top\">返回</a>"); return; } e.printStackTrace(); } // 沒有文件上傳 if (fileList == null || fileList.size() == 0) { out.println("請選擇上傳文件<p />"); out.println("<a href=\"upload.html\" target=\"_top\">返回</a>"); return; } // 得到所有上傳的文件 Iterator fileItr = fileList.iterator(); // 循環處理所有文件 while (fileItr.hasNext()) { FileItem fileItem = null; String path = null; long size = 0; // 得到當前文件 fileItem = (FileItem) fileItr.next(); // 忽略簡單form字段而不是上傳域的文件域(<input type="text" />等) if (fileItem == null || fileItem.isFormField()) { continue; } // 得到文件的完整路徑 path = fileItem.getName(); // 得到文件的大小 size = fileItem.getSize(); if ("".equals(path) || size == 0) { out.println("請選擇上傳文件<p />"); out.println("<a href=\"upload.html\" target=\"_top\">返回</a>"); return; }
// 得到去除路徑的文件名 String t_name = path.substring(path.lastIndexOf("\\") + 1); // 得到文件的擴展名(無擴展名時將得到全名) String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); // 拒絕接受規定文件格式之外的文件類型 int allowFlag = 0; int allowedExtCount = allowedExt.length; for (; allowFlag < allowedExtCount; allowFlag++) { if (allowedExt[allowFlag].equals(t_ext)) break; } if (allowFlag == allowedExtCount) { out.println("請上傳以下類型的文件<p />"); for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++) out.println("*." + allowedExt[allowFlag] + " "); out.println("<p /><a href=\"upload.html\" target=\"_top\">返回</a>"); return; }
long now = System.currentTimeMillis(); // 根據系統時間生成上傳后保存的文件名 String prefix = String.valueOf(now); // 保存的最終文件完整路徑,保存在web根目錄下的ImagesUploaded目錄下 String u_name = request.getRealPath("/") + "ImagesUploaded/" + prefix + "." + t_ext; try { // 保存文件 fileItem.write(new File(u_name)); out.println("文件上傳成功. 已保存為: " + prefix + "." + t_ext + " 文件大小: " + size + "字節<p />"); out.println("<a href=\"upload.html\" target=\"_top\">繼續上傳</a>"); } catch (Exception e) { e.printStackTrace(); } }
}
public void init() throws ServletException { // Put your code here }
posted on 2007-10-02 19:55 Cooky 閱讀(25405) 評論(51) 編輯 收藏 所屬分類: Java
好文章,先試用一下,謝謝!! 回復 更多評論
@xpg 3Q! 回復 更多評論
不錯 謝謝分享 回復 更多評論
@lion:) 回復 更多評論
用Firefox看排版有點小問題...不好意思 回復 更多評論
just test 回復 更多評論
確實很強 回復 更多評論
你很厲害哦 回復 更多評論
@nike..... 回復 更多評論
謝謝! 回復 更多評論
頂一下,非常的感謝你. 回復 更多評論
upload.html 回復 更多評論
ww 回復 更多評論
寫得不錯很有開源精神,不像有些人代碼開源還用軟件整理得亂七八糟。 回復 更多評論
謝謝,正著急呢。 回復 更多評論
good good!!! 回復 更多評論
我把FileUpload.rar解壓到當前文件夾后直接剪切到 Tomcat 主目錄下的 webapps 目錄下, 啟動 Tomcat 后在瀏覽器輸入 http://localhost:8080/FileUpload/upload.html 出現錯誤如下: javax.servlet.ServletException: Error allocating a servlet instance org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) java.lang.Thread.run(Unknown Source) root cause java.lang.UnsupportedClassVersionError: Bad version number in .class file java.lang.ClassLoader.defineClass1(Native Method) java.lang.ClassLoader.defineClass(Unknown Source) java.security.SecureClassLoader.defineClass(Unknown Source) org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1847) org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:873) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1326) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870) org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) java.lang.Thread.run(Unknown Source) 這是什么原因? 麻煩大家幫忙分析一下 回復 更多評論
java.lang.UnsupportedClassVersionError: Bad version number in .class file . 這個應該是由于JDK版本不一致. 我原來的好像是用JDK1.6做的. 你需要重新編譯一下. 版本一致有三個地方需要設置:1.安裝JDK(如1.5或1.6), 設置JAVA_HOME變量. 在Eclipse的菜單:Window->Preferences->Java->Installed JREs: (Add...)jdk1.5.x(或1.6.x)2.設置編譯版本:Window->Preferences->Java->Compiler:Compiler compliance level: 5.0(或6.0, 跟第1步中的一致)3.設置Tomcat運行環境:只要在第1步中設置了JAVA_HOME環境變量后,Tomcat會使用設置的JDK版本. 在MyEclipse需要另外進行設置:Window->Preferences->MyEclipse->Application Servers->Tomcat->Tomcat 6.x(或5.x)->JDK:jdk1.5.x(或1.6.x)[先把你要的Tomcat版本Enable一下]1,2,3中的選擇的JDK版本要一致. 回復 更多評論
@cc如上 回復 更多評論
上傳大文件,比如為幾百m時,開始的時候會在fileList = sfu.parseRequest(request);拋出尺寸過大的異常,但是好像程序會繼續上傳,或者進行別的操作,幾分鐘以后才會跳到異常頁(時間可能根據個人的機器配置不同)。 請問有沒有一個可以遇到異常,馬上到錯誤頁的方法? 回復 更多評論
@temper 好像是這樣的,我還沒找到好的方法。。。 回復 更多評論
我的 回復 更多評論
我靠,我擺渡過來的 回復 更多評論
@paulQuei 呵呵 回復 更多評論
不錯,謝謝~~~ 回復 更多評論
傳遞輸入地址的Form一定要multipart/Form-data編碼嗎? 我還想Form中輸入一些別的內容,用request.getParameter就找不到啊。 回復 更多評論
你寫的很好啊,非常感謝,我在網上找了很多個,沒有一個像你寫的那么明了的 回復 更多評論
為什么一定要過濾掉表單里的文本字段啊,想加點文字描述都不行 回復 更多評論
@WEIQ那個好像是ServletFileUpload的parseRequest方法的問題,它會重新解析request. 至于commons-fileupload可不可以一起處理multipart/form-data和文本,我不清楚,應該可以的吧. 你再查下資料好了, 這個我好久沒搞了.;) 回復 更多評論
哪位高人可以提供上傳文件到數據庫的代碼?顯現身手吧 回復 更多評論
非常感謝您的無私奉獻 回復 更多評論
挺佩服你的,我下載到了common fileuplod包以后,看了API還是不會用,看完您這篇文章才學會使用,我想請教的是,對于一個陌生的東西(比如common fileupload),想要正確使用它,有沒有普遍的方法? 回復 更多評論
那我表單傳過來的其他數據怎么獲得?用request.getParameter就找不到啊 回復 更多評論
寫的太好了!謝謝了! 回復 更多評論
xiexie 回復 更多評論
好久以前寫的了, 多謝大家的支持.那時是在學校里, 自由時間比較多, 現在工作半年了, 大多接觸的是 GWT 和 Ruby on Rails. 不過最近跟幾個朋友用 Lightweight JavaEE 搞個 Blog 網站, 到時會把源碼公開 (在 Google Code 上), 消息我會更新在我的 blogpost 里 (見此網站左邊的鏈接), 也盡量記得把項目地址發在這 :)祝大家的程序員生涯一帆風順 ;-) 回復 更多評論
實用,謝了 回復 更多評論
不錯 回復 更多評論
謝謝樓主 回復 更多評論
謝謝樓主 很好用 回復 更多評論
ImagesUploaded 和 ImagesUploadTemp沒有看到上傳的內容,進行測式的時候,頁面顯示成功了,也把上傳的文件大小,時間打印出來的,就是在ImagesUploaded 和 ImagesUploadTemp沒有看到上傳的內容?這是怎么回事? dfif.setRepository(new File(request.getRealPath("/") + "ImagesUploadTemp")); 中的request.getRealPath(有下劃線)是不推薦使作的方法,和這個有關嗎? 回復 更多評論
@江哥可能是文件路徑的問題. 可以使用以下方法來獲得保存文件的路徑:假設這個Servlet的.class文件最終被放在 FileUpload/WEB-INF/classes/文件夾中 (Windows 下的文件路徑分隔符好像應該使用反斜杠 \), 而要保存文件的文件夾位于 FileUpload/WEB-INF/ImagesUploaded/, 則用以下代碼修改后替換原來的保存文件的部分 (fileItem.wirte(new File(u_name)) 那兒): String fileName = "a.jpg";// TODO replace with your file name /* file path separator: "/" for Unix/Linux, "\\" for Windows */ final String PATH_SEPARATOR = "/"; File currFolder = null; try { currFolder = new File(Main.class.getResource("/").toURI()); } catch (URISyntaxException e) { e.printStackTrace();// TODO log the exception } if (currFolder != null) { String pathToSave = currFolder.getParent() + PATH_SEPARATOR + "ImagesUploaded" + PATH_SEPARATOR; pathToSave += fileName; // System.out.println(pathToSave); fileItem.write(new File(pathToSave)); } else { System.out.println("Can not locate the folder to save file");// TODO } 回復 更多評論
各種方法非常好,謝謝 回復 更多評論
很不錯,頂!!!!! 回復 更多評論
ding ~~~ 回復 更多評論
求源碼 回復 更多評論
謝謝~~ 回復 更多評論
多謝啊 看了這個學習了 回復 更多評論
3Q 回復 更多評論
謝謝,寫得很詳細 回復 更多評論
非常感謝。已經掌握了 回復 更多評論
Powered by: BlogJava Copyright © Cooky