• 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. 所有的上传文件都需要进行依次的判断,才能够分别保存,不能一次性批量保存。
  • 相关阅读:
    关于binary log一点总结[转]
    使用mysql索引技巧及注意事项
    优化php性能的一点总结
    html静态页面实现微信分享思路
    MySql字符串函数使用技巧
    Oracle计算时间差函数
    oracle10g获取Date类型字段无时分秒解决办法!
    Oracle常用函数
    COALESCE操作符
    关于null的操作
  • 原文地址:https://www.cnblogs.com/oumyye/p/4237674.html
Copyright © 2020-2023  润新知