一 、简单介绍
    
使用最为广泛的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. vue-resource文档详细解读

    Vue可以构建一个完全不依赖后端服务的应用,同时也可以与服务端进行数据交互来同步界面的动态更新.Vue通过插件的形式实现了基于AJAX,JSPNP等技术的服务端通信. vue-resource是一个通 ...

  2. Json.net说法——(一)修饰标签,日期序列化

    摘自: http://www.cnblogs.com/jams742003/archive/2009/12/24/1631587.html 通过属性标签自定义JSON序列化 JsonObjectAtt ...

  3. CCControlExtension/CCControlButton

    #ifndef __CCCONTROL_BUTTON_H__ #define __CCCONTROL_BUTTON_H__ #include "CCControl.h" #incl ...

  4. css border-sizing 用法与理解

    浏览器支持 IE Firefox Chrome Safari Opera  支持  支持  支持  支持  支持 Internet Explorer.Opera 以及 Chrome 支持 box-si ...

  5. NDK下IPC问题

    由于AllJoyn的join session timeout问题一直无法解决,我们怀疑AllJoyn有些内部变量没有清理干净,因此考虑将AllJoyn相关功能放到一个单独的进程中,一旦join ses ...

  6. http_load压力测试使用

    介绍:http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死.还可以测试HTTPS类的网站请求. ...

  7. ASP.NET MVC扩展之HtmlHelper辅助方法

    什么是HtmlHelper辅助方法? 其实就是HtmlHelper类的扩展方法,如下所示: namespace System.Web.Mvc.Html { public static class Fo ...

  8. VS报表图解《一》---菜鸟版

    与原先的开发环境VB.EXE不同VS2013自带了报表控件ReportViewer能够内部实现报表的设计,本文主要通过绑定数据集来实现报表的显示 1.加入:reportviewer控件,当将控件显示在 ...

  9. 更新node版本

    步骤如下:1.查看当前的node版本 node -v 2.清除npm当前缓存信息 npm cache clean -f 3.执行下载node npm install -g n 4.下载成功后执行安装 ...

  10. 剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

    题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数 ...