2.使用工具类上传

1.上传工具类的使用
2.1 commons-fileupload组件 是Apache组织旗下的开源的文件上传的组件。使用非常简单易用。
2.2 核心的API
    DiskFileItemFactory类: 用于创建上传对象,设置文件缓存区大小,设置文件缓存目录。
    ServletFileUpload类: 用于在Servlet程序中实现文件上传
    List<FileItem> list = parseRequest(request):  用于解析请求数据,提取和封装文件信息。
    FileItem类: 封装一个文件的所有相关的信息javabean。包含文件名称,文件大小,文件类型,文件数据内容。
2.3 开发步骤
    1)导入commoms-fileuload的jar包
        commons-fileupload-1.2.2.jar  核心包
        commons-io-2.1.jar   辅助包
2)编写程序
2.实现单文件上传
//1.创建DiskFileItemFactory类
        /**
         * 参数一: 表示文件缓存区的大小。如果上传的文件没有超过缓存区大小,则文件不缓存;否则缓存文件,缓存到临时目录。(byte)
         * 参数二: 表示缓存区的临时目录。
         */
        DiskFileItemFactory factory = new DiskFileItemFactory(10*1024,new File("e:/temp/"));
        
        //2.创建ServletFileUpload类
        ServletFileUpload upload = new ServletFileUpload(factory);
        
        /**
         * 设置文件名的编码
         */
        upload.setHeaderEncoding("utf-8");
        
        )
        try {
            List<FileItem> list = upload.parseRequest(request);
            
            //取出第一个上传的文件
            FileItem file = list.get(0);
            
            //得到文件名(getName())
            String fileName = file.getName();
            //得到文件大小
            long fileSize = file.getSize();
            //得到内容类型
            String contentType = file.getContentType();
            //得到文件数据内容
            InputStream in = file.getInputStream();
            
            /**
             * 4.把文件数据内容存储到服务器端的硬盘中
             */
            FileUtils.copyInputStreamToFile(in, new File("e:/files/"+fileName));
            
            /**
             * 5.文件上传完毕,手动清理缓存文件
             */
            file.delete();
            System.out.println("文件名:"+fileName);
            System.out.println("文件大小:"+fileSize);
            System.out.println("文件类型:"+contentType);
            System.out.println("文件数据内容:"+in);
            
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
3. 实现多文件上传
//1.创建DiskFileItemFactory对象
        DiskFileItemFactory factory = new DiskFileItemFactory(10*1024, new File("e:/temp/"));
        //2.创建ServletFileUpload对象
        ServletFileUpload upload = new ServletFileUpload(factory);
        //3.设置文件编码
        upload.setHeaderEncoding("utf-8");
        //4.开始解析文件
        try {
            List<FileItem> list = upload.parseRequest(request);
            if(list!=null){
                List<UploadFile> ufList = new ArrayList<UploadFile>();
                //遍历多个文件
                for(FileItem file: list){
                    //取出文件相关信息
                    String fileName = file.getName();
                    long fileSize = file.getSize();
                    String contentType = file.getContentType();
                    //封装到javabean中
                    UploadFile uf = new UploadFile();
                    uf.setFileName(fileName);
                    uf.setFileSize(fileSize);
                    uf.setFileType(contentType);
                    //放入list中
                    ufList.add(uf);
                    
                    //把文件保存到服务器端的硬盘
                    FileUtils.copyInputStreamToFile(file.getInputStream(), new File("e:/files/"+fileName));
                    //删除缓存文件
                    file.delete();
                }
                request.setAttribute("ufList", ufList);
                request.getRequestDispatcher("/success.jsp").forward(request, response);
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
4.动态选择多文件上传
<html>
  <head> 
    <title>使用组件实现动态多文件上传</title>  
  </head>
  
  <body>
    <form action="${pageContext.request.contextPath }/UploadDemo3" method="post" enctype="multipart/form-data" name="uploadForm">
        <table border="1" width="400px">
            <tbody>
            <tr id="1">
                <td>
                请选择文件:
                </td>
                <td>
                    <input type="file" name="file"/><input type="button" value="删除" onclick="delItem(1)"/>
                </td>
            </tr>
            </tbody>
            <tr>
                <td colspan="2"><input type="button" value="添加" onclick="addIten()"/></td>
            </tr>
            <tr>
                <td colspan="2"><input type="button" value="上传" onclick="checkSunbit()"/></td>
            </tr>
        </table>
    </form>
   <script type="text/javascript">
        var id = 2;
        //添加一行
        function addIten(){
            var trNode = document.createElement("tr");
            trNode.setAttribute("id", id);
            
            var tdNode1 = document.createElement("td");
            tdNode1.innerHTML = "请选择文件:";
            
            var tdNode2 = document.createElement("td");
            var input1 = document.createElement("input");
            input1.setAttribute("type", "file");
            input1.setAttribute("name", "file");
            var input2 = document.createElement("input");
            input2.setAttribute("type", "button");
            input2.setAttribute("value", "删除");
            input2.setAttribute("onclick", "delItem("+id+")");
            tdNode2.appendChild(input1);
            tdNode2.appendChild(input2);
            
            trNode.appendChild(tdNode1);
            trNode.appendChild(tdNode2);
            
            var tbodyNode = document.getElementsByTagName("tbody")[0];
            tbodyNode.appendChild(trNode);  
            id++;   
        }
        //删除一行(根据tr的id值删除)
        function delItem(id){
            if(id>1){
                var trNode = document.getElementById(id);
                var tbodyNode = document.getElementsByTagName("tbody")[0];
                tbodyNode.removeChild(trNode);
                
                id--;
            }
        }
        
        //提交并且检查file属性
        function checkSunbit(){
            //检查file属性是否全部填上
            var fileList = document.getElementsByName("file");
            for(var i=0;i<fileList.length;i++){
                //如果为选择file,则其value值为空
                if(fileList[i].value==null || fileList[i].value==""){
                    alert("请选择第"+(i+1)+"个文件");
                    return;
                }
            }
            //提交表单
            var form = document.forms['uploadForm'];
            form.submit();
        }
    </script>
  </body>
</html>
5.上传文件要注意以下几点
5.1 限制文件类型
//得到文件类型
String contentType = file.getContentType();
System.out.println(contentType);
//如果是图片,才可以上传(image/bmp,jepg,jpg,gif)
if(!contentType.toLowerCase().matches("image/[a-z]*")){
    throw new FileTypeErrorException("文件类型不符合条件!");
}
5.2限制上传文件大小
ServletFileUpload类:
                setFileSizeMax:设置单个文件的最大容量。
                setSizeMax : 设置所有文件的最大容量。
//4.解析请求
        try {
            List<FileItem> list = upload.parseRequest(request);
            if(list!=null){
                for(FileItem file : list){
                    /**
                     * 限制文件类型
                     */
                    //得到文件类型
                    String contentType = file.getContentType();
                    System.out.println(contentType);
                    //如果是图片,才可以上传(image/bmp,jepg,jpg,gif)
                    if(!contentType.toLowerCase().matches("image/[a-z]*")){
                        throw new FileTypeErrorException("文件类型不符合条件!");
                    }
                    
                    //保存文件
                    FileUtils.copyInputStreamToFile(file.getInputStream(), new File("e:/files/"+file.getName()));
                    //删除缓存文件
                    file.delete();
                }
            }
        } catch (FileTypeErrorException e) {
            //e.printStackTrace();
            //处理文件类型错误的异常
            request.setAttribute("message", e.getMessage());
            request.getRequestDispatcher("/05.upload.jsp").forward(request, response);
            return;
        } catch (FileSizeLimitExceededException e) {
            //e.printStackTrace();
            //处理文件超过限制的异常
            request.setAttribute("message", "单个文件不能超过1M");
            request.getRequestDispatcher("/05.upload.jsp").forward(request, response);
            return;
        }  catch (SizeLimitExceededException e) {
            //e.printStackTrace();
            //处理文件超过限制的异常
            request.setAttribute("message", "所有文件不能超过5M");
            request.getRequestDispatcher("/05.upload.jsp").forward(request, response);
            return;
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
5.3查看文件上传的进度
ServletFileUpload类:
setProgressListener(进度监听器): 设置文件上传的监听器
5.4处理文件名重复问题
/ * 解决文件名重复问题:
    * 1)日期_时间_随机数.jpg
    * 2)使用UUID算法(在一台PC都是唯一的)
 */
String fileName = file.getName();
//得到源文件的后缀名
String supfix = fileName.substring(fileName.lastIndexOf(".")); //.jpg
//使用UUID算法生成随机名称
fileName = UUID.randomUUID().toString()+supfix;
5.5得到普通文本控件内容
//判断该FileItem是否是文件还是普通文本空间
if(file.isFormField()){
//普通文本空间(text/password/checkbox/radio/select/texearea)
//得到控件内容
//处理一个普通文本
/*String info = file.getString("utf-8");
System.out.println("描述:"+info);*/
//处理多个普通文本
String fieldName = file.getFieldName();
if("info1".equals(fieldName)){
    String info1 = file.getString("utf-8");
    System.out.println("描述1:"+info1);
}
if("info2".equals(fieldName)){
    String info2 = file.getString("utf-8");
    System.out.println("描述2:"+info2);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,455评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 25,968评论 5 19
  • 吕太后的性格,一面是自私、凶残,另一面则是刚毅、勇敢。吕氏性格中占据主导地位的无疑应该是—歹毒。我们看吕太...
    楚熙有出息阅读 292评论 0 2
  • 习惯了晚上写一点什么让一天更完整,今天最后的时候龚总给我们安排下午的任务,从资源的价值到我们自身的价值,从公司的责...
    梦游世界阅读 382评论 0 0