zoukankan      html  css  js  c++  java
  • 文件上传

    文件上传:
      首先在<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("上传成功");

     

     

     

  • 相关阅读:
    SQL性能优化(不断总结)
    字符编码:区位/国标(gb2312、gbk)/机内码/ASCII/ANSI/Big5
    计算机中信息编码
    删除sybase一列报错:The 'select into' database option is not enabled for database.....
    常用Oracle函数(From OTN)
    常用正则
    剖析Windows的消息运行机制 (学习一)
    服务器响应码及解释
    了解注册表结构
    Windows消息大全收藏
  • 原文地址:https://www.cnblogs.com/xuesheng/p/7399526.html
Copyright © 2011-2022 走看看