上传组件FileUpload组件

Apache提供的文件上传组件:FileUpload组件
文件上传功能开发中比较常用,apache也提供了文件上传组件!

  • FileUpload组件:
    1. 下载源码
    2. 项目中引入jar文件
    commons-fileupload-1.2.1.jar 【文件上传组件核心jar包】
    commons-io-1.4.jar 【封装了对文件处理的相关工具类】
public class UploadServlet extends HttpServlet {

    // upload目录,保存上传的资源
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        /*********文件上传组件: 处理文件上传************/


        try {
            // 1. 文件上传工厂
            FileItemFactory factory = new DiskFileItemFactory();
            // 2. 创建文件上传核心工具类
            ServletFileUpload upload = new ServletFileUpload(factory);

            // 一、设置单个文件允许的最大的大小: 30M
            upload.setFileSizeMax(30*1024*1024);
            // 二、设置文件上传表单允许的总大小: 80M
            upload.setSizeMax(80*1024*1024);
            // 三、 设置上传表单文件名的编码
            // 相当于:request.setCharacterEncoding("UTF-8");
            upload.setHeaderEncoding("UTF-8");


            // 3. 判断: 当前表单是否为文件上传表单
            if (upload.isMultipartContent(request)){
                // 4. 把请求数据转换为一个个FileItem对象,再用集合封装
                List<FileItem> list = upload.parseRequest(request);
                // 遍历: 得到每一个上传的数据
                for (FileItem item: list){
                    // 判断:普通文本数据
                    if (item.isFormField()){
                        // 普通文本数据
                        String fieldName = item.getFieldName(); // 表单元素名称
                        String content = item.getString();      // 表单元素名称, 对应的数据
                        //item.getString("UTF-8");  指定编码
                        System.out.println(fieldName + " " + content);
                    }
                    // 上传文件(文件流) ----> 上传到upload目录下
                    else {
                        // 普通文本数据
                        String fieldName = item.getFieldName(); // 表单元素名称
                        String name = item.getName();           // 文件名              
                        String content = item.getString();      // 表单元素名称, 对应的数据
                        String type = item.getContentType();    // 文件类型
                        InputStream in = item.getInputStream(); // 上传文件流

                        /*
                         *  四、文件名重名
                         *  对于不同用户readme.txt文件,不希望覆盖!
                         *  后台处理: 给用户添加一个唯一标记!
                         */
                        // a. 随机生成一个唯一标记
                        String id = UUID.randomUUID().toString();
                        // b. 与文件名拼接
                        name = id +"#"+ name;

                        // 获取上传基路径
                        String path = getServletContext().getRealPath("/upload");
                        // 创建目标文件
                        File file = new File(path,name);

                        // 工具类,文件上传
                        item.write(file);
                        item.delete();   //删除系统产生的临时文件

                        System.out.println();
                    }

                }

            }
            else {
                System.out.println("当前表单不是文件上传表单,处理失败!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


}
  • DiskFileItemFactory 是创建 FileItem 对象的工厂,这个工厂类常用方法:

    public DiskFileItemFactory(int sizeThreshold, java.io.File repository) 构造函数

    public void setSizeThreshold(int sizeThreshold)
    设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时, fileupload组件将使用临时文件缓存上传文件。

    public void setRepository(java.io.File repository)
    指定临时文件目录,默认值为System.getProperty(“java.io.tmpdir”).

  • ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中。常用方法有:
    boolean isMultipartContent(HttpServletRequest request)
    判断上传表单是否为multipart/form-data类型

    List parseRequest(HttpServletRequest request)
    解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合

    setFileSizeMax(long fileSizeMax) 设置上传文件的最大值
    setSizeMax(long sizeMax)设置上传文件总量的最大值
    setHeaderEncoding(java.lang.String encoding) 设置编码格式
    setProgressListener(ProgressListener pListener)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值