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

    1、首先需要导入依赖包

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.4</version>
            </dependency>

    2、获取文件存放目录

    // 判断表单是否带有文件
    //     if(!ServletFileUpload.isMultipartContent(req))
    //              return;
    
    //        1、获取文件存储路径
            String  realPath = this.getServletContext().getRealPath("/WEB-INF/upload");
            System.out.println(realPath);
    
    //    2、正常都是预先创建好的
            File filePath = new File(realPath);
            if(!filePath.exists())
                filePath.mkdirs();
    
    //       3、获取大文件临时存储路径
            String tempPath = this.getServletContext().getRealPath("/WEB-INF/tempPath");
            File tempFile = new File(tempPath);
            if(!tempFile.exists())
                tempFile.mkdirs();
    
            /**
             * 使用Apache文件上传组件处理文件上传步骤:
             *
             * */
            //4、设置环境:创建一个DiskFileItemFactory工厂,处理文件上传路径或者大小限制
            DiskFileItemFactory  factory = new DiskFileItemFactory();
            factory.setRepository(tempFile);
    
    
            //5、核心操作类:创建一个文件上传解析器。
            ServletFileUpload fileUpload = new ServletFileUpload(factory);
    
            //设置上传文件名的中文乱码
            fileUpload.setHeaderEncoding("utf-8");
    
            //设置单个文件上传大小 2M
    //        fileUpload.setFileSizeMax(2*1024*1024);
            fileUpload.setFileSizeMax(2*1024*1024);
    
            //设置总上传文件大小(有时候一次性上传多个文件,需要有一个上限,此处为10M)
    //        fileUpload.setSizeMax(10*1024*1024);
            fileUpload.setSizeMax(10*1024*1024);
    
            //6、可以监听文件上传进度
            fileUpload.setProgressListener(new ProgressListener() {
                /**
                 * @param bytesRead 已经读取的字节数
                 * @param contentLength 文件总长度
                 * @param items 当前上传的是哪个文件
                 */
                @Override
                public void update(long bytesRead, long contentLength, int items) {
                    System.out.println("已经读取:"+bytesRead);
                    System.out.println("文件总大小:"+contentLength);
                    System.out.println("第:"+items+"个文件");            }
            });
    
            //7、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
            try {
                List<FileItem> fileItems = fileUpload.parseRequest(req);
    
                for (FileItem item : fileItems)
                {
                    if(item.isFormField()){
                        String filedName = item.getFieldName();//普通输入项数据的名
                        //解决普通输入项的数据的中文乱码问题
                        String filedValue = item.getString("UTF-8");//普通输入项的值
                        System.out.println("普通字段:"+filedName+"=="+filedValue);
                       }else{
                        //如果fileitem中封装的是上传文件,得到上传的文件名称,
                        String fileName = item.getName();//文件名
                        //多个文件上传输入框有空 的 异常处理
                        if(fileName==null || "".equals(fileName.trim())){  //去空格是否为空
                            continue;// 为空,跳过当次循环,  第一个没输入则跳过可以继续输入第二个
                         }
    
                        fileName = fileName.substring(fileName.lastIndexOf("\")+1);
                       //拼接上传路径。存放路径+上传的文件名
                        String fileRealPath = realPath+"\"+fileName;
                        //构建输入输出流
                        InputStream in = item.getInputStream(); //获取item中的上传文件的输入流
                        OutputStream out = new FileOutputStream(fileRealPath); //创建一个文件输出流
    
                        //创建一个缓冲区
                        byte b[] = new byte[1024];
                        //判断输入流中的数据是否已经读完的标识
                        int len = 0;
                        //循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
                        while((len=in.read(b)) != -1){  //没数据了返回-1
                           //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\"+filename)当中
                           out.write(b, 0, len);
                        }
                        //关闭流
                        out.close();
                        in.close();
                       //删除临时文件
                         try {
                            Thread.sleep(3000);
                            } catch (InterruptedException e) {
                            e.printStackTrace();
                           }
                           item.delete();//删除处理文件上传时生成的临时文件
                       System.out.println("文件上传成功");
                    }
    
    
                }
    
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
  • 相关阅读:
    桌面图标背景透明
    如何做好一个中小型企业计算机网络管理员
    打开IE8总是提示欢迎使用?怎样使它不提示?
    js 操作select和option,添加select列
    bios 被加密,怎么进入bios
    Foxmail自动收取新邮件
    代码片段
    提高生活幸福感的13个方法
    水晶报表的真实体验
    游标替代
  • 原文地址:https://www.cnblogs.com/xp2h/p/12354201.html
Copyright © 2011-2022 走看看