上一篇讲解了smartupload组件上传,那么这一篇我们讲解commons-FileUpload组件上传

FileUpload是Apache组织(www.apache.org)提供的免费的上传组件,可以直接从Apache站点上下载(下载地址:http://commons.apache.org/fileupload/),本文使用的版本是1.2.1,但是FileUpload组件本身还依赖于commons组件,所以从Apache下载此组件的时候还需要连同commons组件的IO包一起下载(下载地址:http://commons.apache.org/io/) 
commons-fileUpload上传组件对中文进行了良好的处理,对上传文件不会出现中文乱码问题,是目前最广泛的组件,
将commons-fileupload-1.2.1.jar和commons-io-1.4.jar配置到TOMCAT_HOME/lib/目录中
³FileUpload的具体上传操作与SmartUpload相比有着很高的复杂度,下面来看一看FileUpload上传的基本步骤:
  1. 1创建磁盘工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
  2. 创建处理工具:ServletFileUpload upload = new ServletFileUpload(factory);
  3. 设置上传文件大小:upload.setFileSizeMax(3145728);
  4. 接收全部内容:List<FileItem> items = upload.parseRequest(request);

上传原理

使用fileupload组件接收完全部的数据之后,所有的数据都保存在了List集合之中,则就需要使用Iterator输出每一个,但是由于其中既有普通的文本数据又有上传的文件,每一个上传内容都使用一个FileItem类对象表示。

所以当使用Iterator依次取出每一个FileItem对象的时候,就可以使用FileItem类中的isFormField()方法来判断当前操作的内容是普通的文本还是上传文件,如果是上传文件,则将文件的内容依次取出;如果是普通的文本,则直接通过getString()方法取得具体的信息。

 
 
组件上传代码实例一
html代码
<html>
<head><title>commons-FileUpload组件上传</title></head>
<body>
<form action="fileupload_demo01.jsp" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br>
照片:<input type="file" name="pic"><br>
<input type="submit" value="上传">
<input type="reset" value="重置">
</form>
</body>
</html>

jsp代码

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<html>
<head><title>commons-FileUpload组件上传</title></head>
<body>
<%
DiskFileItemFactory factory = new DiskFileItemFactory() ;
ServletFileUpload upload= new ServletFileUpload(factory) ;
upload.setFileSizeMax(3 * 1024 * 1024) ; // 只能上传3M
List<FileItem> items = upload.parseRequest(request) ; // 接收全部内容
Iterator<FileItem> iter = items.iterator() ;
while(iter.hasNext()){
FileItem item = iter.next() ;
String fieldName = item.getFieldName() ; // 取得表单控件的名称
%>
<ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4>
<%
if(!item.isFormField()){ // 不是普通文本
String fileName = item.getName() ; // 取得文件的名称
String contentType = item.getContentType() ; // 文件类型
long sizeInBytes = item.getSize() ;
%>
<li>上传文件名称:<%=fileName%>
<li>上传文件类型:<%=contentType%>
<li>上传文件大小:<%=sizeInBytes%>
<%
} else {
String value = item.getString() ;
%>
<li>普通参数:<%=value%>
<%
}
%> </ul>
<%
}
%>
</body>
</html>

组件上传代码实例二

<html>
<head><title>commons-FileUpload组件上传</title></head>
<body>
<form action="fileupload_demo02.jsp" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br>
照片:<input type="file" name="pic1"><br>
照片:<input type="file" name="pic2"><br>
照片:<input type="file" name="pic3"><br>
<input type="submit" value="上传">
<input type="reset" value="重置">
</form>
</body>
</html>

JSP代码

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*,java.io.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="cn.mldn.lxh.util.*"%>
<html>
<head><title>commons-fileUpload组件上传实例二</title></head>
<body>
<%
DiskFileItemFactory factory = new DiskFileItemFactory() ;
factory.setRepository(new File(this.getServletContext().getRealPath("/") + "uploadtemp")) ; // 更准确的说是一个临时文件
ServletFileUpload upload = new ServletFileUpload(factory) ;
upload.setFileSizeMax(3 * 1024 * 1024) ; // 只能上传3M
List<FileItem> items = upload.parseRequest(request) ; // 接收全部内容
Iterator<FileItem> iter = items.iterator() ;
IPTimeStamp its = new IPTimeStamp(/* request.getRemoteAddr() */) ;
while(iter.hasNext()){
FileItem item = iter.next() ;
String fieldName = item.getFieldName() ; // 取得表单控件的名称
%>
<ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4>
<%
if(!item.isFormField()){ // 不是普通文本
File saveFile = null ;
InputStream input = null ;
OutputStream output = null ;
input = item.getInputStream() ;
output = new FileOutputStream(new File(this.getServletContext().getRealPath("/")+"upload"+File.separator+its.getIPTimeRand()+"."+item.getName().split("\\.")[1])) ;
int temp = 0 ;
byte data[] = new byte[512] ;
while((temp=input.read(data,0,512))!=-1){
output.write(data) ; // 分块保存
}
input.close() ;
output.close() ;
} else {
String value = item.getString() ;
%>
<li>普通参数:<%=value%>
<%
}
%> </ul>
<%
}
%>
</body>
</html>

注意:本代码在建立项目时需要在项目名称下创建upload文件夹才能正常运行。

FileUpload组件的不便之处:

  1. 无法像使用request.getParameter()方法那样准确的取得提交的参数;
  2. 无法像使用request.getParameterValues()那样准确的取得一组提交参数;
  3. 所有的上传文件都需要进行依次的判断,才能够分别保存,不能一次性批量保存。

java基础篇---文件上传(commons-FileUpload组件)的更多相关文章

  1. java基础篇---文件上传(smartupload组件)

    文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本篇主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用 ...

  2. java基础篇---文件上传(组件)

    转载自:http://www.cnblogs.com/oumyye/p/4234969.html 文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本 ...

  3. JAVA基础篇—文件上传下载

    /index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  4. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  5. 文件上传 - Commons FileUpload介绍

    概述 FileUpload能够以多种不同的方式使用,具体取决于应用程序的要求.在最简单的情况下,调用单个方法来解析servlet请求,然后处理解析出来的Item集合.此外也可以自定义FileUploa ...

  6. java支持断点续传文件上传和下载组件

    java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接 ...

  7. 文件上传使用FileUpload组件进行代码实现

    使用FileUpload组件进行代码实现 实现步骤 1. 获取解析器工厂: DiskFileItemFactory 2. 获取解析器对象: ServletFileUpload 3. 解析request ...

  8. Java中实现文件上传下载的三种解决方案

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

  9. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

随机推荐

  1. 环信EaseUI集成错误 Unknown type name 'NSString' NSLocalizedString

    环信集成本来认为很简单的,有现成的UI,照着文档直接傻瓜操作就行,没曾想聊天记录不能长时间保存,于是乎就有了这篇记录环信坑的笔记 在下载的环信的SDK时候里面会有两个包,一个完整版的,一个简洁版的,导 ...

  2. Xcode 各版本简介

    1.Xcode 验证 在终端输入 spctl 命令,并带上安装的 Xcode 的路径 $ spctl --assess --verbose /Applications/Xcode.app 之后会看到类 ...

  3. 【Linux】字符转换命令expand

    这命令就是在将 [tab] 按键转成空格键: [root@www ~]# expand [-t] file 选项与参数: -t :后面可以接数字.一般来说,一个 tab 按键可以用 个空格键取代. 我 ...

  4. redis常用性能分析命令

    一.连接 src/redis-cli -h 10.20.137.141 -p 6379 >auth 123456789 src/redis-cli -h 10.20.137.141 -p 637 ...

  5. Mac OS X各版本号的历史费用和升级关系

     Mac OS X各版本号的历史费用和升级关系 OS X 10.6 Snow Leopard 早在2009年10月,Mac OS X10.6雪豹是通过光盘发送.并在英国推出时.费用£25 OS X ...

  6. Java 垃圾回收思维导图

    文 by / 林本托 Tips 做一个终身学习的人. Java 的垃圾回收,不像 C和 C++语言,内存的分配和释放都是靠程序员来控制的.而 Java 的内存回收,程序员是不能也是无法干预,具体什么时 ...

  7. 基础004_V7-DSP Slice

    主要参考ug479.pdf.之前的文章:FIR调用DSP48E_05.本文主要记录基本用法. 一.DSP48核 A-参数说明 instrctions,多个功能,通过sel选用 目前没发现C勾选与否,有 ...

  8. 你不知道的KVO的内部实现

    通过强大的Runtime 实现.第一次观察某个Object 时,runtime 会创建一个新的继承自 object 对应Class 的 subClass.在这个新subClass 里它重写了被观察的k ...

  9. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  10. 精通D3.js笔记

    DOM常用属性 innerHTML: 元素标签内部的文本. innerText outerHTML outerText nodeName: 节点名称 parentNode: 父节点 nextSibli ...