文件上传的时要注意的是 form 表单必须是 method = "post" enctype = “multipart/form-data”
<form action="FileUpload" method="post" enctype="multipart/form-data">
file : <input type="file" name="file"/><br>
<input type="submit" value="submit">
</form>
借助第三方库 (commons-fileupload) ,commons-fileupload 依赖 commons-io
Servlet 代码:FileUpload
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 检查一个请求是否是一个文件上传的请求
if(ServletFileUpload.isMultipartContent(request)){
// 创建一个基于磁盘文件条目的工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 分别指定缓存文件路径和文件上传的目录
String tempPath = getServletContext().getRealPath("temp");
String filePath = getServletContext().getRealPath("file");
// 你也可以给这个工厂添加一些约束
// 超过设置的值会写到给出的磁盘目录中
factory.setSizeThreshold(1024*1024);
factory.setRepository(new File(tempPath));
// 或者直接使用这个构造方法
// DiskFileItemFactory factory1 = new DiskFileItemFactory(1024*1024, new File("temp"));
// 创建了个文件上传的处理
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024*1024*10);
try {
// 解释请求, 得到一个文件条目的List
@SuppressWarnings("unchecked")
List<FileItem> items = upload.parseRequest(request);
for(FileItem item : items){
// 判断一个条目是否是一个普通的字段域
if(item.isFormField()){
/*
* 对提交过来的表单中普通的参数进行处理
* name 是参数名
* value 是参数的值
*/
String name = item.getFieldName();
String value = item.getString();
}else{
/*
* 对文件进行相关的操作
*/
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInByte = item.getSize();
// ... ...
// 把文件写入到磁盘
item.write(new File(filePath, fileName));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
把大的文件一直存放在内存里面是不现实的。所以可以看到下面的这段代码
factory.setSizeThreshold(1024*1024);
这样当你上传的文件超过这个设置的值的大小 ,文件会被写到磁盘上的一个临时文件里面,之后又会被 org.apache.commons.io.FileCleaner这个类自动的清理掉。FileCleaner 会开启一个回收的线程。
如果不再使用这个使用的时候,应该要停止这个线程。比如 web应用程序结束的时候(停止Tomcat时。org.apache.commons.fileupload.servlet.FileCleanerCleanup 会停止掉这个临时文件清理线程。这时需要配制一个监听器,在web-app里加上配制文件:
<listener>
<listener-class>
org.apache.commons.fileupload.servlet.FileCleanerCleanup
</listener-class>
</listener>
或者你也可使用 FileCleanerCleanup 提供一个 org.apache.commons.io.FileCleaningTracker 实例来进行清理临时文件。在构建DiskFileItemFactory 时可以加上这样的代码。
FileCleaningTracker fileCleaningTracker
= FileCleanerCleanup.getFileCleaningTracker(getServletContext());
factory.setFileCleaningTracker(fileCleaningTracker);
Item有一个简单的方法可以把文件写到磁盘上(Item.writer(file)),或者也可以自己使用 OuputStream 把文件写到磁盘上,这样可以做一些其他的操作,比如计算一个文件的上传进度反馈给用户。
相对 Item.write(),comment-fileupload 还提供了一种性能上更好的方式把文件写到磁盘上
try {
// 对请求进行解释,得到一个文件条目的迭代器
FileItemIterator iter = upload.getItemIterator(request);
// 进行迭代
while (iter.hasNext()){
FileItemStream item = iter.next();
String fieldName = item.getFieldName();
InputStream in = item.openStream();
// 进行判断
if(item.isFormField()){
// 得到参数的值
String fieldValue = Streams.asString(in);
}else{
// 文件名
String fileName = item.getName();
// 创建一个输出流
OutputStream out = new BufferedOutputStream(
new FileOutputStream(new File(filePath,fileName)));
// 文件输出到磁盘
Streams.copy(in, out, true);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
参考: http://commons.apache.org/fileupload/using.html
分享到:
相关推荐
java+servlet+commons-io-2.4.jar+commons-fileupload-1.3.jar实现文件的上传与下载
commons-fileupload上传组件,J2EE中JSP、Servlet所用到的文件上传组件包括commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar
java实现上传下载的demo,包括jsp和servlet代码。适合初学者,看完之后你会发现java实现上传下载其实很简单。同时我提供了需要用到的两个架包(commons-fileupload-1.2.1.jar;commons-io-1.3.2.jar),把两个架包放...
jsp+servlet实现文件上传和下载,需要使用commons-fileupload,commons-io.jar java库文件
本文实例为大家分享了JSP使用commons-fileupload实现文件上传代码,供大家参考,具体内容如下 1、准备: 将commons-fileupload-1.1.zip和commons-io-1.1.zip复制到”\WEB-INF\lib”目录下 2、首先是Servlet:...
jsp+servlet 上传和下载包 commons-io-1.3.2.jar commons-fileupload-1.0.jar jsmartcom_zh_CN.jar
NULL 博文链接:https://ice-cream12-21.iteye.com/blog/2222058
内含文档说明和demo演示!~ 用struts的commons-fileUpload.jar实现文件上传,所以文件都可以,并另加图片预览功能!~ 采用简单常用jsp+servlet实现,同样对使用struts实现上传进行了说明~
HttpClient 上传文件 Servlet 处理文件上传 commons-fileupload 处理文件上传 commons-fileupload 处理文件上传,在struts中可以不用对应actionform,在jsp,servelet中应用都很方便
利用Ajax和Servlet实现文件上传,用来commons-fileupload和commons-io两个包。这两个包也在里边。东西做的很简单,但重点是能对这个方法有所了解就行了,有人想做的更炫的可以自行修改。希望能对大家有所帮助。如果...
即可使用的servlet+jsp的文件上传。采用commons-fileupload.jar组件,简单实用!
FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能力 HttpClient Commons-HttpClient 提供了可以工作于HTTP协议客户端的一个框架. IO IO 是一个 I/O 工具集 Jelly Jelly是一个基于 ...
<%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> *"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> boolean ...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
文件上传和下载功能是Java Web必备技能,很实用。 本文使用的是Apache下的著名的文件上传组件 org.apache.commons.fileupload 实现 下面结合最近看到的一些资料以及自己的尝试,先写第一篇文件上传。后续会逐步实现...
1、利用org.apache.commons.fileupload编写的文件上传和下载的前台和后台代码,前台代码是Jsp,后台是用servlet处理,共2个例子,各有不同,比较使用; 2、有用jspSmartupload制作一个文件上传和下载的例子,其制作...
commons-io-1.4.jar commons-fileupload-1.2.1.jar
commons-fileupload-1.0.jar commons-fileupload-1.2.2.jar commons-io-1.4.jar ext-all.js ext-base.js javaee.jar JFreeChart_Jar jspupload.jar LIST.TXT log4j-1.2.9.jar msbase.jar mssqlserver.jar msutil.jar...
利用commons-io-2.0.1.jar和commons-fileupload-1.2.2.jar实现文件锁上传 附jar包下载地址
自己用servlet写的文件上传及下载功能带进度条 主要用到两个jar:commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar 内容介绍: com.fm.FileManagerService:一个servlet用来实现主要的文件上传下载逻辑的 ...