一 、简单介绍
    
使用最为广泛的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. 【mybatis】mybatis中批量插入 批量更新 batch 进行insert 和 update,或者切割LIst进行批量操作

    ================================================================== 分别展示 mybatis 批量新增  和 批量更新   的操作: ...

  2. C#开源框架整理

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...

  3. golang解析json格式 -- 全

    项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的. 交互的数据类似如下格式: {"sn":1,"ls" ...

  4. iOS中 xib自定义View在storyboard中的使用

    1,创建UIView 的SubClass 命名为MyView 2, new一个名为MyView的xib p1 3,配置xib的属性 p2 4,为View 添加背景色,添加一个按钮并定制按钮约束,这里我 ...

  5. List of regional organizations by population

    https://baike.baidu.com/item/国际组织/261053?fr=aladdin 经济文化类组织(非政府组织) 创行 狮子会 全球青年领导力联盟 乐施会 政治类组织 欧洲联盟(欧 ...

  6. python2和python3的编码问题

    python2中有两种类型 str字符串和unicode字符串 python3则改成了 bytes和str字符串 在python2中‘xxx’和b‘xxx’都是str字符串,u‘xxx’是unicod ...

  7. uv计算

    lightmap shadowmap heightmap 它们有一个自己的camera 对应cameraMatrix float3 TransfromToTextureCoord(float4 Pos ...

  8. Eclipse代码布局怎么使用退格和缩进快捷键?

    Eclipse代码布局怎么使用退格和缩进快捷键? 好的程序,不仅要运行快速准确,而且还要易于理解.研究表明,清晰的代码布局可以提高程序猿的理解能力.何为代码布局?其实就是代码的缩进.留白等.为了保证清 ...

  9. Struts2中的页面跳转

    内容源自:Struts2中的页面跳转 一.全局页面的设置如果<package>包中的一些action都返回success,并且返回的页面都是同一个JSP页面,这样就可以配置全局的结果页面. ...

  10. CentOS7 Failed to start LSB: Bring up/down networking. 已解决!!!

    服务器更换了主板之前配置的静态IP发现启动网卡出现异常. 执行 service network restart 出现以下错误 Restarting network (via systemctl):  ...