文件上传

文件上传:
  首先在<form>表单的enctype属性的值设为enctype="multipart/form-data">
  method的请求方式要设置为post,因为上传文件的内容较大,get请求最大为256个字节.
  在form中 添加标签<input type="file">
  这样在servlet中获取前台页面的值不能再用request.getParameter()的方式。否则内容一致为空。
  这时我们引入一个新的工具类commons-fileupload。
  需要导入两个包:commons-fileupload和commons-io。

  • 核心类:
  1. DiskFileItemFactory

  工厂用于创建ServletFileUpload设置缓存等

  该类一般直接使用构造器直接创建实例

   方法:

  public void setSizeThreshold(int sizeThreshold)

   用于设置缓存文件的大小(默认值10kb

   public void setRepository(File repository)

   用于设置缓存文件位置(默认系统缓存目录)

  1. ServletFileUpload

  该类用于解析request对象从而获取用户发送的请求参数(包括普通参数和文件参数

  该类需要调用有参构造器创建实例,构造器中需要一个DiskFileItemFactory作为参数

  方法:

  public List<FileItem> parseRequest(HttpServletRequest request)

   解析request对象,获取请求参数,返回的是一个ListList中保存的是一个FileItem对象,一个对象代表一请求参数。

   public void setFileSizeMax(long fileSizeMax)

  设置单个文件的大小限制,单位为B

  如果上传文件超出限制,会在parseRequest()抛出异常

   FileSizeLimitExceededException

  public void setSizeMax(long sizeMax)

  限制请求内容的总大小,单位为B

  如果上传文件超出限制,会在parseRequest()抛出异常

  SizeLimitExceededException。

  1. FileItem

  该类用于封装用户发送的参数和文件,也就是用户发送来的信息将会被封装成一个FileItem对象,我们通过该对象获取请求参数或上传文件的信息

  该类不用我们手动创建,由ServletFileItem解析request后返回。

  方法

  String getFieldName()

  获取表单项的名字,也就是input当中的name属性的值。

  String getName();

  获取上传的文件名普通的请求参数为null

  String getString(String encoding);

   获取内容

  若为文件将文件的流转换为字符串。

  若为请求参数,则获取请求参数的value

   encoding参数需要指定一个字符集

  boolean isFormField();

  判断当前的FileItem封装的是普通请求参数,还是一个文件。

  如果为普通参数返回true

  如果为文件参数返回:false

  String getContentType();

   获取上传文件的MIME类型

   long getSize();

  获取内容的大小

  

//创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建请求解析器
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//设置上传单个文件的的大小
fileUpload.setFileSizeMax(1024*1024*3);
//设置上传总文件的大小
fileUpload.setSizeMax(1024*1024*3*10);
//设置响应内容的编码
response.setContentType("text/html;charset=utf-8");
try {
    //解析请求信息,获取FileItem的集合
    List<FileItem> items = fileUpload.parseRequest(request);
    //遍历集合
    for (FileItem fileItem : items) {
        //如果是普通的表单项
        if(fileItem.isFormField()){
            //获取参数名
            String fieldName = fileItem.getFieldName();
            //获取参数值
            String value = fileItem.getString("utf-8");
            System.out.println(fieldName+" = "+value);
            //如果是文件表单项
        }else{
            //获取文件名
            String fileName = fileItem.getName();
            //获取上传路径
            String realPath = getServletContext().getRealPath("/WEB-INF/upload");
            //检查upload文件夹是否存在,如果不存在则创建
            File f = new File(realPath);
            if(!f.exists()){
                f.mkdir();
            };
            //为避免重名生成一个uuid作为文件名的前缀,去掉UUID中的“-”
            String prefix = UUID.randomUUID().toString().replace("-", "");
            //将文件写入到服务器中

      // 有些浏览器获取文件名的时候会包含路径,这时需要去掉路径,也就是去掉\之前的字符串,所以+1。
          if (filename.contains("\\")) {
        filename = prefix.substring(prefix.lastIndexOf("\\")+1);
                }

            fileItem.write(new File(realPath+"/"+prefix+"_"+fileName));
            //清楚文件缓存
            fileItem.delete();
        }
}
} catch (Exception e) {
    if(e instanceof SizeLimitExceededException){
        //文件总大小超出限制
        response.getWriter().print("上传文件的总大小不能超过30M");
    }else if(e instanceof FileSizeLimitExceededException){
        //单个文件大小超出限制
        response.getWriter().print("上传单个文件的大小不能超过3M");
    }
} 
response.getWriter().print("上传成功");

 

 

 

 

posted @ 2017-08-20 12:12  薛小生  阅读(149)  评论(0编辑  收藏  举报