代码改变世界

JSP中用Commons-FileUpload组件控制文件上传

2018-01-21 21:34  开发潜力  阅读(1061)  评论(0编辑  收藏  举报

1.控制文件上传的类型

示例代码:

  //解析form表单中所有文件
             List<FileItem> items = upload.parseRequest(request);
             Iterator<FileItem> iter = items.iterator();
              FileItem item = (FileItem)iter.next();
              if (!item.isFormField()){//文件表单字段
                 String fileName = item.getName();
                 //通过Arrays类的asList()方法创建固定长度的集合
                 List<String> filType = Arrays.asList("jpeg","gif","jpg");
                 String ext = fileName.substring(fileName.lastIndexOf(".")+1);
                 if (!filType.contains(ext))//判断文件类型是否在允许范围内
                     out.print("上传失败,文件类型只能是gif、jpg、jpeg");
                 else{
                    if (fileName != null && !fileName.equals("")){
                        File fullFile = new File(item.getName());
                        File saveFile = new File(uploadFilePath,fullFile.getName());
                        item.write(saveFile);
                        uploadFileName = fullFile.getName();
                        out.print("上传成功后的文件名是:"+uploadFileName);
                    }
                    }
              }

上面代码中,通过Arrays类的asList()方法创建固定长度的集合,也就是得到允许文件类型的集合,然后通过集合的contains()方法匹配上传文件的扩展名来判断文件类型是否在允许范围内。

2.控制文件上传的大小

示例代码:

//创建临时文件目录路径
              File tempPatchFile = new File("d:\\temp\\buffer\\");
              if (!tempPatchFile.exists())//判断文件或目录是否存在
                  tempPatchFile.mkdirs();//创建指定的目录,包括所在必需但不存在的父目录
              if (isMultipart){
                  DiskFileItemFactory factory = new DiskFileItemFactory();
                  //设置缓冲区大小4KB
                  factory.setSizeThreshold(4096);
                  //设置上传文件用到临时文件存放路径
                  factory.setRepository(tempPatchFile);
                  ServletFileUpload upload = new ServletFileUpload(factory);
                  //设置一个完整请求的最大允许大小
                  upload.setSizeMax(5120);//5MB,大小不能超过5MB
              }
             while (iter.hasNext()){//依次处理每个文件
                FileItem item = (FileItem)iter.next();
                if (item.isFormField()){//普通表单字段
                   filedName = item.getFiledName();//表单字段的name属性值
                   if (filedName.equals("user")){
                       //输出表单字段的值
                       out.print(item.getString("UTF-8")+"上传了文件。<br/>");
                   }
                }else{//文件表单字段
                   String fileName = item.getName();
                   if (fileName != null && !fileName.equals("")){
                       File fullFile = new File(item.getName());
                       File saveFile = new File(uploadFilePath,fullFile.getName());
                       item.write(saveFile);
                       uploadFileName = fullFile.getName();
                       out.print("上传成功后的文件名是:"+uploadFileName+",文件大小是:"+item.getSize()+"bytes!");
                   }
                }
             }
         }catch (FileUploadBase.SizeLimitExceededException ex){
           out.prtin("上传失败,文件太大,全部文件的最大限制是:"+upload.getSizeMax()+"bytes!");
         }catch (Exception e){
           e.printStackTrace();
         }
     }

上面代码中,创建临时文件目录路径,通过DisFileItemFactory对象的setSizeThreshold()方法设置缓冲区大小,当上传文件大小超过缓冲区大小,则临时存储在通过DiskFileItemFactory对象的setRepository()方法设置的临时文件目录路径中。同时通过ServletFileUpload对象的setSizeMax()限制了一个完整请求的最大字节数,如果超出设置的字节数,则会抛出一个FileUploadBase.SizeLimitExceededException类型的异常,并通过异常处理提示错误信息。