文件上传之 commons-fileupload(一)
一 、简单介绍
使用最为广泛的Java文件上传组件,Struts本身采用这个包来处理文件上传。其基本原理:
FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的
request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对
每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是
表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。
二、介绍下 commons-FileUpload上传过程:
首先要引入的.jar文件:
commons-fileupload-1.2.1.jar
commons-io-1.2.jar(此两个文件可以到官网:http://commons.apache.org/
(里面还会有帮助文档API) 下载)
其次值得注意的是,凡是要上载文件的表单都必须设置enctype属性,且属性的值必须是multipart/form-data,同时请求方法必须是POST!!!!
1、检测request中是否包含有multipart内容(isMultipartContent(request)是它的一个静态方法)
ServletFileUpload.isMultipartContent(request)
2、如果有,生成DiskFileItemFactory工厂将进行相关的设置(不知道的情况下也可以不设置)
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(4096);// 设置缓冲区大小,这里是4kb// Location to save data that is larger than maxMemSize.
factory.setRepository(new
File("d:/"));// 设置临时目录factory.setHeaderEncoding("UTF-8");//设置字符集 防止中文文件名乱码
3、生成上传ServletFileUpload类,并将DiskFileFactory工厂传给它,并对ServletFileUpload进行配置
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(3*1024*1024);//设置上传文件大小3M
upload.setSizeMax(6*1024*1024);//设置请求总文件大小6M
4、从request得到上传的文件列表,并获得其迭代器
// Parse the request to get file items.
List<FileItem> fileItems =
upload.parseRequest(request);// Process the uploaded file items
Iterator i = fileItems.iterator();
5、处理文件:写入或者其他操作
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (fi.isFormField()) {//当是表单域时,进行的处理
// Get the uploaded file parameters
String fieldName = fi.getFieldName();//得到元素的name属性的值String fieldValue=fi.getString("utf-8");//得到元素的value的值
String fileName = fi.getName();//这里是表单域,所以得到的是null} else {//当是文件域时,将文件保存到硬盘中
String basePath = request.getRealPath("/upload");
String contentType =
fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes =
fi.getSize();String fieldName =
fi.getFieldName();//得到元素的name属String fileName = fi.getName();//取得上传的文件名
file = new File(basePath+"/"+filename);fi.write(file);
}out.println("Uploaded Filename: " + fileName +
"<br>");
}
}}
说明:
FileItem接口是对用户上传文件的封装
DiskFileItemFactory 实现了FileItemFactory接口,主要方法有public
FileItem createItem(String fieldName, String contentType, boolean
isFormField, String fileName)
ServletFileUpload从FileUpload继承,而FileUpload又从FileUploadBase继承,功能:分析传入的request对象、得到文件列表FileItemIterator……
文件上传之 commons-fileupload(一)的更多相关文章
- jsp简易文件上传(common.fileupload)
昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章 ...
- 实现文件上传功能(FileUpload组件)
文件上传: 项目中经常用到文件上传. 自己实现文件上传,使用文件上传组件fileupload组件 1.指定表单类型为文件上传, enctype=”multipart/form-data” 2.提交方式 ...
- .Net 使用文件上传控件FileUpload上传图片
例1: 来源:http://long546324.iteye.com/blog/349946 Default.aspx文档: <%@ Page Language="C#" A ...
- MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传
本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...
- 转:在Struts 2中实现文件上传
(本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...
- Spring MVC文件上传教程 commons-io/commons-uploadfile
Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...
- Apache Commons FileUpload 实现文件上传
Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...
- 使用FileUpload实现Servlet的文件上传
简介 FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下的文件上传功能. FileUpload链接 FileUpload 是基于Apache的Commons ...
- FileUpload文件上传控件
1.FileUpload控件的主要功能是向指定目录上传文件.FileUpload控件不会自动上传控件,而需要设置相关的事件处理程序,然后在程序中实现文件上传. 2.FileUpload控件常见的属性 ...
- 文件上传组件FileUpload 以及邮箱搭建JavaMail
文件上传与下载 1.1 文件上传 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 文件上传,要点: 前台: 1 ...
随机推荐
- sonar如何添加自定义JAVA规则
参考: 1.https://segmentfault.com/a/1190000008659108 2.https://docs.sonarqube.org/display/DEV/Adding+Co ...
- iOS:键盘弹出和收起的通知使用
介绍:不论是UITextField,还是UITextView,使用它们输入文字时都是有键盘的弹出,此时可能会挡住我们创建的一分部其他视图,此时,就需要根据键盘的高度将我们被隐藏的部分View做向上或者 ...
- dcm4che tools 之dicomdir
1.在dcm4che-3.3.7目录下的bin文件夹下运行命令行窗口 运行以下命令: dcmdir -c E:\TEMP\DICOMDIR E:\TEMP\04E439CE 为E:\TEMP\04E4 ...
- 如何理解redo和undo
redo和undo的区别 redo--> undo-->datafileinsert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信 ...
- zabbix3.2 报错 Database error
一.Database errorThe frontend does not match Zabbix database. Current database version (mandatory/opt ...
- Python数据结构与算法(几种排序)
数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是 ...
- Oracle imp关于fromuser 和 touser的用法
fromuser就是把当前的dmp文件中的某一个用户下的数据取出.touser就是把现在dmp文件中的数据导入到目标库的指定user下.具体命令这样.exp userid=system/manager ...
- 用好Git 和 SVN,轻松驾驭版本管理
用好Git 和 SVN,轻松驾驭版本管理 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高频率使用到的 Git 常用命令. 一.Git vs S ...
- Mac Finder 显示路径和复制路径
Mac Finder 显示路径和复制路径 学习了:https://www.jianshu.com/p/757f9ffc5acf 设置 defaults write com.apple.finder _ ...
- java实现归并排序算法
归并排序算法思想:分而治之(divide - conquer);每个递归过程涉及三个步骤第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.第二, 治理: ...