一 、简单介绍
    
使用最为广泛的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(一)的更多相关文章

  1. jsp简易文件上传(common.fileupload)

    昨天开始重新架构我的V&View(维视),之前写文章使用的是一个kindediter的插件,挺好用的.最近不知道咋了,出现了些小问题.早在写V&View的时候就想用以下两种方法实现文章 ...

  2. 实现文件上传功能(FileUpload组件)

    文件上传: 项目中经常用到文件上传. 自己实现文件上传,使用文件上传组件fileupload组件 1.指定表单类型为文件上传, enctype=”multipart/form-data” 2.提交方式 ...

  3. .Net 使用文件上传控件FileUpload上传图片

    例1: 来源:http://long546324.iteye.com/blog/349946 Default.aspx文档: <%@ Page Language="C#" A ...

  4. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  5. 转:在Struts 2中实现文件上传

    (本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...

  6. Spring MVC文件上传教程 commons-io/commons-uploadfile

    Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...

  7. Apache Commons FileUpload 实现文件上传

    Commons FileUpload简介 Apache Commons是一个专注于可重用Java组件开发的 Apache 项目.Apache Commons项目由三个部分组成: 1.Commons P ...

  8. 使用FileUpload实现Servlet的文件上传

    简介 FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下的文件上传功能. FileUpload链接 FileUpload 是基于Apache的Commons ...

  9. FileUpload文件上传控件

    1.FileUpload控件的主要功能是向指定目录上传文件.FileUpload控件不会自动上传控件,而需要设置相关的事件处理程序,然后在程序中实现文件上传. 2.FileUpload控件常见的属性 ...

  10. 文件上传组件FileUpload 以及邮箱搭建JavaMail

     文件上传与下载 1.1 文件上传 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 文件上传,要点: 前台: 1 ...

随机推荐

  1. Oracle数据库中的所有用户名

    select * from dba_users; 查看数据库里面所有用户,前提是你是有dba权限的帐号,如sys,systemselect * from all_users;  查看你能管理的所有用户 ...

  2. Android 通过URL scheme 实现点击浏览器中的URL链接,启动特定的App,并调转页面传递参数

    点击浏览器中的URL链接,启动特定的App. 首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]" ...

  3. jquery中remove()与detach()的区别

    说到删除节点,马上就会想到remove,不过原来还有一个detach,而且它们还是有区别的,就是detach保留了jquery的数据,而remove就会完全删除干净.所以如果在删除一个dom节点后还想 ...

  4. jQuery 当页面 ID 不唯一时,寻找元素

     $(需要寻找元素的父层).find(元素ID,元素Class) 

  5. Vue侦听器watch

    虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器.这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化.当需要在数据变化时执行异步或开销较大的操作时,这 ...

  6. SQL Server-数据库中强varchar类型使用sum函数计算总和

    select sum(cast(totalmoney AS DECIMAL)) as totalmoney from dbo.t_wxbill

  7. 用editplus编写python

    语法高亮和自己主动补全: http://www.editplus.com/files/pythonfiles.zip 选择菜单条的-->工具-->配置用户工具-->设置&语法 ...

  8. TestNG系列之二:TestNG套件测试

    测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合.在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征.这也允许灵活的配置要运行的测试.套件可以包含 ...

  9. div 隐藏和显示

    转自:http://aideehorn.iteye.com/blog/417558 div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visib ...

  10. java泛型介绍

    一.泛型初衷 Java集合不会知道我们需要用它来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要就具有很好的通用性.但这样做也带来两个问题: –集合对元素类型没有任何限制,这样可能引 ...