java基础篇---文件上传(commons-FileUpload组件)

上一篇讲解了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. 所有的上传文件都需要进行依次的判断,才能够分别保存,不能一次性批量保存。
时间: 2025-01-04 11:08:35

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

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

文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,本篇主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用组件是怎么完成上传的原理的? 废话不多说直接上代码 import java.io.*; import java.util.*; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.Fil

JAVA基础篇—文件上传下载

/index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&qu

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

第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null; String fileAddre="/numUp"; try { InputStream stream = file.getInputStream();// 把文件读入 String filePath = request.getRealPath(fileAddre);//取系统当前路径

【Java】JavaWeb文件上传和下载

文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件上传功能.common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载.用该组件可实现一次上传一个或多个文件,并可限制文件大小. 开发环境 创建一个javaweb项目,加入common-f

【原创】用JAVA实现大文件上传及显示进度信息

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

java+web+大文件上传下载

文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用HTML5的API,对文件上传进行渐进式增强:     * iframe上传  * ajax上传  * 进度条  * 文件预览  * 拖放上传 1.1 传统形式 文件上传的传统形式,是使用表单元素file,参考 http://www.ruanyifeng.com/blog/2012/08/file_

文件的上传Commons FileUpload(web基础学习笔记十六)

一.表单设置 <form action="<%=request.getContextPath()%>/jsp/admin/doAdd.jsp" enctype="multipart/form-data" method="post"> </form> 设置属性: enctype="multipart/form-data"; <tr> <td class="text_

java里面的文件上传与下载

文件的上传与下载主要用到两种方法:1.方法一:commons-fileupload.jar commons-io.jarapache的commons-fileupload实现文件上传,下载 [upload]package com.handson.bbs.servlet; import java.io.File;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.Se

Java代码实现文件上传(转载)

刚刚发表了一篇Java发送电子邮件,以前真是没注意,commons里这么多常用项目,惭愧呀,直到现在回顾;要学习的真是太多了,还是缺少真正的学习能力... 这里用到的是commons-fileupload.jar与commons-io.jar;下载地址http://commons.apache.org/ 这是一个web工程,所以先在webroot下新建一个jsp,其实直接用index.jsp就行了;下面是前端代码: <%@ page language="java" import=