文件上传-程序员宅基地

技术标签: java  JavaWeb  

文件上传:

准备工作:

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);
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44954686/article/details/111593211

智能推荐

Markdown语法_markdown声明一个图片地址复用-程序员宅基地

文章浏览阅读176次。生成目录使用[TOC]标题标题前面加#和空格几个#号表示几级标题,最多支持六级标题字体加粗需要加粗的文字左右分别用两个*号包裹斜体需要倾斜的文字左右分别用一个*号包裹倾斜加粗左右分别用三个*号包裹删除线需要删除线的文字左右分别用两个~~号包裹引用在引用的文字前加>引用也可以嵌套,如加两个>>分割线三个或者三个以上的-或者*都可以图片..._markdown声明一个图片地址复用

WaitForSingleObject函数用法-程序员宅基地

文章浏览阅读2.9w次,点赞17次,收藏87次。用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法。  但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力。这时,只能考虑使用内核模式。  Windows提供了许多内核对象来实现线程的同步。对于线程同步而言,这些内核对象有两个非常重要的状态:“已通知”状态,“未通知”状态(也有翻译为:受信状态,未受信状态)。Wi..._waitforsingleobject

生产漏洞修复总结_cve-2016-6515-程序员宅基地

文章浏览阅读5.1k次,点赞2次,收藏16次。1、 修复ssh相关漏洞漏洞列表:OpenSSH auth_password函数拒绝服务漏洞(CVE-2016-6515)OpenSSH do_setup_env函数权限提升漏洞(CVE-2015-8325)OpenSSH glob表达式拒绝服务漏洞(CVE-2010-4755)OpenSSH J-PAKE授权问题漏洞(CVE-2010-4478)Openssh MaxAu..._cve-2016-6515

Linux rocketMQ 安装和使用-程序员宅基地

文章浏览阅读1.3w次。在对比了RabbitMQ,apacheMQ之后,发现还是 rocketMQ 好用。为什么好用,百度查查就都知道了。不说废话直接说说 Linux安装:1、需要软件(免安装版) 下载地址 [release 下载地址](https://github.com/apache/incubator-rocketmq/releases) https://github.com/apache/incu

2021后台开发春招实习(失败)经验分享_基础不好后端实习-程序员宅基地

文章浏览阅读358次。前言成功的经验是值得参考的,但我也要分享一下我较为失败的春招实习经验,算是给大家先踩踩坑吧~个人认为我的基础条件不差,无论是学校,还是项目、实习、博客。但我的春招还是极其不顺利的,最终也只收获了一家大厂。回顾一下过去大半年,感觉主要问题还在于没有对春招进行针对性复习和准备,最大问题就是基础知识准备太少了。以下的话记录一下准备过程,希望能有帮助:1. 明确岗位类型和主要语言我投的都是类似于后端开发岗,语言大部分都是Java,不过字节当时直接被内推到一个常用python的部门,因为没怎么准备,自然有点_基础不好后端实习

php随机产生6位字符串,PHP生成随机字符串(3种方法)-程序员宅基地

文章浏览阅读2.4k次。如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码。随机密码也就是一串固定长度的字符串,文章整理了几种生成随机字符串的方法。方法一1、在33 – 126中生成一个随机整数,如35。2、将35转换成对应的ASCII码字符,如35对应#。3、重复以上1、2步骤n次,连接成n位的密码。该算法主要用到了两个函数,mt_rand ( int $min , int $max )函数用于生成随机整数,..._php随机生成6位带数字和字母

随便推点

CentOS 连接Windows共享的桥接网络_centos 命令连接win10共享网络-程序员宅基地

文章浏览阅读1k次。解决的问题:有一台CentOS 7.6 Linux台式计算机,没有无线网络;想共享笔记本连接的无线网络,笔记本配置无线和有线以太网。解决方法:笔记本连接好WIFI; 笔记本以太网设置自动获得IP,自动获得DNS服务器..._centos 命令连接win10共享网络

C++中的 istringstream_c++中的istringstream函数-程序员宅基地

文章浏览阅读184次。今天在看别人的C++程序源码的时候,看到了一个比较有用的C++的输入输出控制类。因为之前没有使用过,故特地学习了一下,在此总结。程序源码中使用了这样的语句:ifstream fin(fname);int a,b,c;string s;getline(fin, s);istringstream ss(s);ss &gt;&gt; a&gt;&gt;b&gt;&gt;c;将读..._c++中的istringstream函数

检索的原理和方法步骤-程序员宅基地

文章浏览阅读1k次。检索的原理和方法步骤 一、计算机EI检索的原理 计算机EI检索的原理是将检索者的提问与系统中的记录进行匹配运算,符合条件者即为命中记录,最后输出结果。主要检索功能有布尔逻辑检索、位置逻辑检索,字段限制和截词检索等。布尔逻辑检索由逻辑或(OR)、逻辑与(AND)和逻辑非(NOT)构成,不同检..._信息检索的原理与步骤

日期类型的处理方法,SimpleDateFormat的使用_simpledateformat.format用法不存在的月份-程序员宅基地

文章浏览阅读271次。关于SimpleDateFormat的两种使用的场景1、将将字符串类型日期转化为日期类型的数据//创建SimpleDateFormat对象,用来将字符串类型日期转化为日期类型的数据 SimpleDateFormat sdf = new SimpleDateFormat(); //创建java.util.Date对象 Date newbirthday = null; //字符串日..._simpledateformat.format用法不存在的月份

G003-186-08_domain model diagram百度云下载-程序员宅基地

文章浏览阅读657次。作业报告目录项目需求提案计划书一、 项目介绍(一)项目背景(二)产品目的(三) 应用领域1.项目范围2.功能范围3.应用对象(四) 项目优势(五) 可行性分析1.技术可行性分析2.经济可行性分析3. 社会可行性分析项目需求萃取分析书一、 项目介绍(一)项目背景(二)项目目的(三)应用领域(四)项目前景二、问题描述(一)获取问题(二)明确问题(三)问题域分析三、涉众分析(一)涉众四、 硬数据采样Project Roadmap(一)自制的关于私人影院的相_domain model diagram百度云下载

idea卡在scanning maven projects reading pom.xml-程序员宅基地

文章浏览阅读2.1k次。在hosts中添加内容