apache文件上传组件详解

************本人水平有限,在学习时请用批判的态度学习,有问题给我留言************

 

说详解有点没有底气了,这是讲文件上传时的一个例子,我把每一行代码的注释都写了出来,加强理解,熟悉api。

 

我把上传文件功能放到了一个工程里,前台有一个index.jsp页面,一个success.jsp页面

一个js目录、一个css文件

需要apache commons-fileupload包

commons-io包

前台还有个js的小例子,模拟软键盘,例子不是原创,只是为了美化前台。

 

工程下载地址:http://download.csdn.net/source/1458143

 

废话不多说了,上代码!!


下面的是核心的servlet

 

package cn.itcast.upload;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * 文件上传 servlet
 * 详尽注释每一步做法和含义,方便大家学习
 *
 * @version 1.0
 * @author caohua
 * @company 传智博客
 */
public class FileUploadServlet extends HttpServlet {

    /**
     * 序列化servlet,防止钝化后无法恢复的问题
     */
    private static final long serialVersionUID = 1L;

    public FileUploadServlet() {
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=gb2312");//设置返回头信息
        PrintWriter out = response.getWriter();//返回的输出
       
        String path = getServletContext().getRealPath("/upload");//得到该应用下的upload目录在服务器上的绝对路径
   
        if( path == null ){//如果为空表示不能访问,可能是系统设置了访问权限
            out.print("无法访问该目录!");
            return;
        }
       
        File uploadDir = new File(path);//得到该目录的文件对象
       
        if(!uploadDir.exists()){//判断该目录是否存在
           
            if(!uploadDir.mkdir()){//如果不存在就建立该目录
                out.print("无法创建该目录!");//如果建立失败,给出提示
                return;
            }
        }
       
        if(!ServletFileUpload.isMultipartContent(request)){//用 ServletFileUpload 类的静态方法 isMultipartContent 判断 request 是否是 multipart/form-data 类型
            out.print("只能 multipart/form-data 类型数据");
            return;
        }
        //创建 DiskFileItemFactory 对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
       
        //factory.setRepository(tempDir);可以设置缓存目录
        factory.setSizeThreshold(1024 * 1024);//超过1m的数据采用临时文件缓存
       
        ServletFileUpload upload = new ServletFileUpload(factory);//创建 ServletFileUpload 对象,构造的时候传一个 DiskFileItemFactory 对象进去
        upload.setFileSizeMax(1024 * 1024 * 2);//单个文件大小
        upload.setHeaderEncoding("gb2312");//设置普通字段名称和文件字段的文件名所采用的字符集编码
        upload.setSizeMax(1024 * 1024 * 4);//最多上传2m的文件
       
        List list = null;
        try {
            list = upload.parseRequest(request);//解析 request 对象 得到一个包含 FileItem 对象的 list
        } catch (FileUploadException e) {
            out.print("解析文件时出现问题:");
            e.printStackTrace();
            return;
        }
       
        Iterator it = list.iterator();//遍历list
        while(it.hasNext()){
            FileItem fi = (FileItem)it.next();//类型转换
           
            if(fi.isFormField()){//判断该 FileItem 对象是否是一个普通表单类型
                String name = fi.getFieldName();//得到普通表单类型的表单名
                String content = fi.getString("GB2312");//用指定编码得到普通表单的值
                request.setAttribute(name, content);//把键值放入 request 对象
            }else{
                try{
                    String pathStr = fi.getName();//得到文件表单的值,就是用户本地的文件路径
                    //如果文件表单为空,则不处理
                    if(pathStr.trim().equals("")){
                        continue;
                    }
                   
                    int start = pathStr.lastIndexOf("//");//得到文件名在路径中的位置
                    String fileName = pathStr.substring(start + 1);//得到文件名
                   
                    File pathDest = new File( path , fileName );//创建上传上来的文件对象  由服务器上存放文件的路径 + 文件名 组成
                   
                    fi.write(pathDest);//写文件
                   
                    String name = fi.getFieldName();//得到文件表单的名称
                    request.setAttribute(name, fileName);//把表单名、文件名放入 request
                   
                }catch(Exception e){
                    out.print("存储文件错误:");
                    e.printStackTrace();
                    return;
                }
                finally{//立即删除保存表单字段内容的临时文件
                    fi.delete();
                }
            }
        }
       
        StringBuffer filelist = new StringBuffer();//得到可变字符串对象
       
        //把上传的文件名拼装到可变字符串中
        String file1 = (String)request.getAttribute("file1");
        makeUplist(filelist, file1);
        String file2 = (String)request.getAttribute("file2");
        makeUplist(filelist, file2);
       
        request.setAttribute("list", filelist);//把文件名的字符串放入 request
        request.getRequestDispatcher("success.jsp").forward(request, response);//请求转发到指定页面
       
    }
    /**
     * 将 str 追加到 sb中,以“,”隔开
     * @param sb
     * @param str
     */
    private void makeUplist(StringBuffer sb ,String str){
       
        if(str != null){//追加的字符串为空则不做任何操作
            if(sb.length() != 0){//如果可变字符串长度不为0,需要用“,”隔开
                sb.append(",");
            }
            sb.append(str);//追加字符串
        }
       
    }

    public void init() throws ServletException {
    }

}

 

 

下面是index.jsp

<%@ page language="java" contentType="text/html; charset=gb2312"
    pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>传智博客---文件上传</title>
<style type="text/css">
    body {
    font-size: 100%;
    font-family: "Trebuchet MS",Verdana, Arial, Helvetica, sans-serif;
    padding-top: 100px;
    }
    label { display: block; margin-top: 10px; }
    #login { width: 300px; margin: 0 auto; border: 1px solid #eee; padding: 25px; background-color: #FFFFCC; }
    a { color: #0066CC; text-decoration: none; border-bottom: 1px dotted #0066cc; }
    #submit_butt { margin-top: 15px; }
    h3 { margin-top: 0; }
</style>
<link href="keyboardstyle.css" type="text/css" rel="stylesheet" />
</head>

<body>

<div id="login">

<h3>文件上传</h3>
<form action="fileupload" method="post" enctype="multipart/form-data">
    <label for="username">用户名:</label>
    <input type="text" name="name" id="username" />
   
    <label for="pwd">密码:</label>
    <input type="text" name="password" id="pwd"/>
    <a href="#" id="showkeyboard" title="Type in your password using a virtual keyboard.">键盘</a> <br />
   
    <label for="pwd">文件1:</label>
    <input type="file" name="file1" />
    <label for="pwd">文件2:</label>
    <input type="file" name="file2" />
    <br>
    <input type="submit" name="Submit" id="submit_butt" value="提交" />
</form>

<div id="keyboard">
    <div id="row0">
        <input name="accent" type="button" value="`" />
        <input name="1" type="button" value="1" />
        <input name="2" type="button" value="2" />
        <input name="3" type="button" value="3" />
        <input name="4" type="button" value="4" />
        <input name="5" type="button" value="5" />
        <input name="6" type="button" value="6" />
        <input name="7" type="button" value="7" />
        <input name="8" type="button" value="8" />
        <input name="9" type="button" value="9" />
        <input name="0" type="button" value="0" />
        <input name="-" type="button" value="-" />
        <input name="=" type="button" value="=" />
        <input name="backspace" type="button" value="Backspace" />
    </div>
   
    <div id="row0_shift">
        <input name="tilde" type="button" value="~" />
        <input name="exc" type="button" value="!" />
        <input name="at" type="button" value="@" />
        <input name="hash" type="button" value="#" />
        <input name="dollar" type="button" value="$" />
        <input name="percent" type="button" value="%" />
        <input name="caret" type="button" value="^" />
        <input name="ampersand" type="button" value="&" />
        <input name="asterik" type="button" value="*" />
        <input name="openbracket" type="button" value="(" />
        <input name="closebracket" type="button" value=")" />
        <input name="underscore" type="button" value="_" />
        <input name="plus" type="button" value="+" />
        <input name="backspace" type="button" value="Backspace" />
    </div>
   
    <div id="row1">
        <input name="q" type="button" value="q" />
        <input name="w" type="button" value="w" />
        <input name="e" type="button" value="e" />
        <input name="r" type="button" value="r" />
        <input name="t" type="button" value="t" />
        <input name="y" type="button" value="y" />
        <input name="u" type="button" value="u" />
        <input name="i" type="button" value="i" />
        <input name="o" type="button" value="o" />
        <input name="p" type="button" value="p" />
        <input name="[" type="button" value="[" />
        <input name="]" type="button" value="]" />
        <input name="/" type="button" value="/" />
    </div>
   
    <div id="row1_shift">
        <input name="Q" type="button" value="Q" />
        <input name="W" type="button" value="W" />
        <input name="E" type="button" value="E" />
        <input name="R" type="button" value="R" />
        <input name="T" type="button" value="T" />
        <input name="Y" type="button" value="Y" />
        <input name="U" type="button" value="U" />
        <input name="I" type="button" value="I" />
        <input name="O" type="button" value="O" />
        <input name="P" type="button" value="P" />
        <input name="{" type="button" value="{" />
        <input name="}" type="button" value="}" />
        <input name="|" type="button" value="|" />
    </div>
   
    <div id="row2">
        <input name="a" type="button" value="a" />
        <input name="s" type="button" value="s" />
        <input name="d" type="button" value="d" />
        <input name="f" type="button" value="f" />
        <input name="g" type="button" value="g" />
        <input name="h" type="button" value="h" />
        <input name="j" type="button" value="j" />
        <input name="k" type="button" value="k" />
        <input name="l" type="button" value="l" />
        <input name=";" type="button" value=";" />
        <input name="'" type="button" value="'" />   
    </div>
   
    <div id="row2_shift">
        <input name="a" type="button" value="A" />
        <input name="s" type="button" value="S" />
        <input name="d" type="button" value="D" />
        <input name="f" type="button" value="F" />
        <input name="g" type="button" value="G" />
        <input name="h" type="button" value="H" />
        <input name="j" type="button" value="J" />
        <input name="k" type="button" value="K" />
        <input name="l" type="button" value="L" />
        <input name=";" type="button" value=":" />
        <input name="'" type="button" value='"' />
    </div>
   
    <div id="row3">
        <input name="Shift" type="button" value="Shift" id="shift" />
        <input name="z" type="button" value="z" />
        <input name="x" type="button" value="x" />
        <input name="c" type="button" value="c" />
        <input name="v" type="button" value="v" />
        <input name="b" type="button" value="b" />
        <input name="n" type="button" value="n" />
        <input name="m" type="button" value="m" />
        <input name="," type="button" value="," />
        <input name="." type="button" value="." />
        <input name="/" type="button" value="/" />
    </div>
   
    <div id="row3_shift">
        <input name="Shift" type="button" value="Shift" id="shifton" />
        <input name="Z" type="button" value="Z" />
        <input name="X" type="button" value="X" />
        <input name="C" type="button" value="C" />
        <input name="V" type="button" value="V" />
        <input name="B" type="button" value="B" />
        <input name="N" type="button" value="N" />
        <input name="M" type="button" value="M" />
        <input name="lt" type="button" value="&lt;" />
        <input name="gt" type="button" value="&gt;" />
        <input name="?" type="button" value="?" />
    </div>
   
    <div id="spacebar">
        <input name="spacebar" type="button" value=" " />
    </div>
   
</div>

</div>

<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-personalized-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-fieldselection.js"></script>

<script type="text/javascript" src="js/vkeyboard.js"></script>

</body>

</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值