Apache Commons FileUpload
来源:互联网 发布:日本 9月进出口数据 编辑:程序博客网 时间:2024/05/22 14:24
Apache Commons FileUpload
更详细API请登录http://commons.apache.org/查看。
为你的servlet和Web应用程序提供文件上传功能。
前提条件
需要2点 1 POST 提交 2 在表单加入 multipart/form-data 属性
demo:
前台:
<form method="POST" enctype="multipart/form-data" action="fup.cgi"> File to upload: <input type="file" name="upfile"><br/> Notes about the file: <input type="text" name="note"><br/> <br/> <input type="submit" value="Press"> to upload the file!</form>
后台:
分为三部分:
- 保存到临时文件
/**.存储的是临时文件**/ // 建立一个 disk-based file items 工厂类 DiskFileItemFactory factory = new DiskFileItemFactory(); // 配置这个factory ServletContext servletContext = this.getServletConfig().getServletContext(); //File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); File repository = new File("e:\\TEST\\"); factory.setRepository(repository); // new一个 file upload 处理器类 ServletFileUpload upload = new ServletFileUpload(factory); // 解析 request try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { System.out.println(item.getFieldName()); } } catch (FileUploadException e) { e.printStackTrace(); }
我把上传的文件保存在了e盘的TEST文件夹下:
执行完这段代码会生成.tmp类型的文件执行完之后 会把它清空
这是更详细的配置
// 建立一个 disk-based file items 工厂类 其他设置 DiskFileItemFactory factory = new DiskFileItemFactory(); // 配置这个factory //setSizeThreshold方法用于设置是否使用临时文件保存解析出的数据的那个临界值 默认是10240 factory.setSizeThreshold(102400); File repository = new File("e:\\TEST\\"); factory.setRepository(repository); // new一个 file upload 处理器类 ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大上传文件Max大小 upload.setSizeMax(1024000000); // 解析 request try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { System.out.println(item.getFieldName()); } } catch (FileUploadException e) { e.printStackTrace(); }
- 存入指定位置
try { List<FileItem> items = upload.parseRequest(request); // Process the uploaded items Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); if (item.isFormField()) { System.out.println("processFormField"); String name = item.getFieldName(); System.out.println(name); //processFormField(item); } else { //processUploadedFile(item); //System.out.println("processUploadedFile"); //表单中的名称 String getFieldName = item.getFieldName(); //文件名 String itemgetName = item.getName(); //文件类别 String contentType = item.getContentType(); //是否在内存中 boolean isInMemory = item.isInMemory(); //大小 long sizeInBytes = item.getSize(); //System.out.println(getFieldName + "---" + itemgetName + "---" + contentType + "---" + isInMemory + "---" + sizeInBytes); File uploadedFile = new File("e:\\TEST\\" + itemgetName); try { item.write(uploadedFile); } catch (Exception e) { e.printStackTrace(); } } } } catch (FileUploadException e) { e.printStackTrace(); }
当临时文件(.tmp)在不再被使用的时候(如果相应的java.io.File是可回收的则更好)会自动被删除.这会被org.apache.commons.io.FileCleaningTracker的一个实例启动的一个收割线程静默执行(两种方式)
1 配置web.xml
<web-app> <listener> <listener-class> org.apache.commons.fileupload.servlet.FileCleanerCleanup </listener-class> </listener></web-app>
2使用DiskFileItemFactory中set fileCleaningTracker。
public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context, File repository) { FileCleaningTracker fileCleaningTracker = FileCleanerCleanup.getFileCleaningTracker(context); DiskFileItemFactory factory = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, repository); factory.setFileCleaningTracker(fileCleaningTracker); return factory; }
- 监控上传(可选)
Apache Commons FileUpload 可以使用ProgressListener监控文件上传状态
ProgressListener progressListener = new ProgressListener(){ public void update(long pBytesRead, long pContentLength, int pItems) { //读取的文件 // System.out.println("We are currently reading item " + pItems); if (pContentLength == -1) { //System.out.println("So far, " + pBytesRead + " bytes have been read."); } else {// System.out.println("So far, " + pBytesRead + " of " + pContentLength// + " bytes have been read."); float total = ((float)pBytesRead /(float) pContentLength); // 将上传状态放入session request.getSession().setAttribute("total",total); } } }; upload.setProgressListener(progressListener);
补充:使用ajax上传文件
有两个限制条件
1. 支h5的浏览器
2. jquery版本在1.2以上(我用的1.11网上说 用2.x最好)
3. 进度条插件 我在www.jq22.com/随意找了一个进度条插件
h5中有一个formData属性可以把文件已二进制的形式传到后台
实现如下
前台代码:
<form id="myform" method="POST" enctype="multipart/form-data" action="upload"> File to upload: <input type="file" name="upfile1"><br/> Notes about the file: <input type="text" name="note"><br/> <br/> <input type="button" onclick="dosubmit()" value="Press"> to upload the file! </form> <div class="box"> <div class="ok"></div> <div class="tbox"> <div class="tiao"></div> </div> </div>
<script> /*add——创建tbx下的div加文字和变宽度的方法*/ function add(i){ var tbox =$(".tbox"); var tiao =$(".tiao"); tiao.css("width",i+"%").html(i+"%"); }var time_count = null; function xh2(){ time_count = setInterval('chlink()', 100); //注意:执行的函数需要加引号,否则会报错的 } function chlink() { $.ajax({ url: "ajaxRequest" , type: "POST" , success: function(data, status){ var total = data * 100; if(total<100){ add(total); }else if(total==100){ add(total); $(".ok").html("上传成功").fadeIn("slow"); clearInterval(time_count); } console.log(total); } }); } function dosubmit(){ $(".ok").html("上传成功").fadeOut("slow"); //$("#myform").submit(); doUpload(); xh2(); } function doUpload() { var formData = new FormData($( "#myform" )[0]); $.ajax({ url: 'upload' , type: 'POST', data: formData, async: true, cache: false, contentType: false, processData: false, success: function (returndata) { }, error: function (returndata) { $(".ok").html("加载失败").fadeIn("slow"); clearInterval(time_count); } }); } </script>
我的思路是:ajax上传文件,前台每隔固定时间去后台获取ProgressListener中设置到session中文件上传信息然后展示到前台 这里用到了setInterval函数(清除该函数用 clearInterval函数 具体用法见上面代码 )
不足:需要多次请求服务器 多用户同时上传时会有问题(session中的key需要唯一)
- com.apache.commons.FileUpload
- apache commons fileupload FAQ
- apache commons fileupload 团队
- apache commons fileupload 资源管理
- Apache Commons FileUpload
- Apache Commons FileUpload基础教程
- Apache Commons FileUpload
- org.apache.commons.fileupload.DiskFileUpload
- org.apache.commons.fileupload.DiskFileUpload1
- apache commons-fileupload包简介
- org.apache.commons.fileupload.FileItemFactory
- apache commons-fileupload 文件上传
- Apache Commons fileUpload文件上传
- apache commons fileupload 邮箱列表
- apache commons fileupload pmd报告
- apache commons fileupload cpd报告
- org.apache.commons.fileupload的使用
- 利用apache-commons-FileUpload组件进行上传。
- 机器学习的策略
- 机器学习概述
- 数据结构实验之链表五:单链表的拆分
- SourceTree 启用/禁用Mercurial 或 Git
- eclipse远程调试Tomcat方法
- Apache Commons FileUpload
- 自定义view系列(5)--99.99%实现QQ侧滑删除效果
- BeanUtils.copyProperties属性拷贝日期为空异常
- 程序员的职业素养 Bob
- <hadoop学习历程>--笔记心得1-hadoop基本思想与概念
- Java——this关键字
- tcpdump抓取HTTP包
- C++:类设计要素
- 结构型模式