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 阅读(25396) 评论(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