文件上传

文件上传:

准备工作:

jar包:common-io,common-fileupload

文件上传的注意事项:

为保证服务器的安全,上传文件应该放在外界无法直接访问的目录下,如WEB-INF目录下

为保证文件覆盖的现象发生要为上传文件产生一个唯一文件名

限制上传文件的最大值

限制上传文件的类型,判端后缀名是否合法

使用的类

ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个FileItem对象;

DiskFileItemFactory解析ServletFileUpload对象请求;

上传

使用表单上传文件,

get:上传文件大小有限制

post:上传文件没有大小限制

代码:

创建DiskFileItemFactory对象

        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024*1024);
        factory.setRepository(tmpFile);

创建servletFileUpLoad对象将请求表单中的每一项转换为FileItem对象

 ServletFileUpload upload = new ServletFileUpload(factory);
        //监听上传进度
        upload.setProgressListener(new ProgressListener() {
            @Override
            //l:已经读取到的文件大小
            //l1:文件大小
            public void update(long l, long l1, int i) {
                System.out.println("总大小:" + l1 + "已经上传" + l);
            }
        });
        //处理乱码问题
        upload.setHeaderEncoding("UTF-8");
        //设置单个文件的最大值
        upload.setFileSizeMax(1024*1024*10);
        //设置总共能上传文件大小
        upload.setSizeMax(1024*1024*10);

处理上传文件

​ 创建文件夹,为维持文件夹的原子性,使用uuid创建文件夹名


            //把前端请求封装成一个FileItem对象,需要从servletFileUpLoad中获取
        try {
            List<FileItem> fileItems = upload.parseRequest(req);
            //遍历每个fileitem对象
            for (FileItem fileItem:fileItems){

                //判断上传文件是带文件的表单还是普通的表单
                if(fileItem.isFormField()){//普通的表单
                    String name = fileItem.getFieldName();
                    //处理乱码
                    String value = fileItem.getString("UTF-8");
                    System.out.println(name + value);
                }else {//带文件的表单
                        //-------处理文件------//
                    String name = fileItem.getName();
                    System.out.println("name---->" + name);
                    if(name.trim().equals("")||name==null){
                        continue;
                    }

                    String fileName = name.substring(name.lastIndexOf("\\") + 1);
                    System.out.println("文件名------>"+fileName);
                    //-------存放地址------//
                    UUID uuid = UUID.randomUUID();
                    String realPath=uploadPath+"/"+uuid;
                    System.out.println("存放地址------>" + realPath);
                    File realPathFile = new File(realPath);
                    if(!realPathFile.exists()){
                       realPathFile.mkdir();
                    }
                        //-----文件传输-----//
                    InputStream is = fileItem.getInputStream();
                    FileOutputStream os = new FileOutputStream(realPathFile + "/" + fileName);
                    byte[] buffer = new byte[1024];
                    int len=0;

                    while ((len=is.read(buffer))>0){
                        os.write(buffer,0,len);
                    }

                    os.close();
                    is.close();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

注意乱码问题

若出现乱码文件需要添加过滤器对向servlet的请求进行过滤,以此避免中文乱码

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值