springBoot 实现文件上传下载(多文件上传)

postman 传参方式,这是多文件上传案例,单文件上传仿照此案例即可。

springBoot 实现文件上传下载(多文件上传)_第1张图片

 

废话不多说直接上代码

  /**
     *  单文件上传
     * @param file
     * @return
     */
    @PostMapping("/uploadFile")
    public Map uploadFile(MultipartFile file){
        Map param  = new HashMap<>(16);
        // 1.判断文件是否为空
        if (file.isEmpty()){
            param.put("301","上传文件为空");
            return param;
        }
        //2.获取文件名称  完整文件名称  english.doc
        String fileName= file.getOriginalFilename();
        //3.获取文件后缀名称     .doc
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        //4.生成新的文件名称,使用UUID生成一个新的文件名,保证文件不重复
        //fb235f87-a6f5-4397-bb53-faa3880bb1df.doc
        String newFileName = UUID.randomUUID()+suffixName;
        /**   第一种:
         * 文件上传实际工作中,肯定会和某条数据有关联,通常设计表的时候会把新文件名称,
         * 原文件名称各为一列,会保存到数据库中。
         *新文件名称:在下载的时候会根据新文件名称去文件服务器或者 特定文件路径去查找新文件名称的文件
         *原文件名称: 替换新文件名称,给用户良好体验
         *
         * 第二种:可能是一个文件列表没有任何关联,可以省略  5 步骤
         */
        // 5.保存到与之有关联的表中,新文件名称,源文件名称,可带后缀。
        // TODO
        //6.设置文件路径,判断文件路径是否存在,不存在创建
        //这里可以是文件服务器地址,也可以是你电脑中某个专门存放文件的路径
        String path ="F:\\image123123\\";
        if(!new File(path).isDirectory()){
            new File(path).mkdir();
        }
        File uploadFile = new File(path+newFileName);
        try {
            file.transferTo(uploadFile);
        } catch (IOException e) {
            param.put("文件上传失败","201");
            e.printStackTrace();
        }
        param.put("文件上传成功","200");
        return param;
    }

    /**
     *  多文件上传(支持单个文件)
     * @param files
     * @return
     */
    @PostMapping("/moreUpload")
    public Map moreUpload(List files, HttpServletRequest request){
        Map param = new HashMap<>();
       if(null!=files&&files.size()>0){
           files.stream().forEach(file->{
               //获取完整文件名
                String fileName = file.getOriginalFilename();
                //获取后缀名
               String suffixName = fileName.substring(fileName.lastIndexOf("."));
               //生成唯一不重复的文件名称
               String newFileName = UUID.randomUUID()+suffixName;
               // 文件保存路径,可以写在配置文件中,使用@Value得到值
               String path = "F:/image123123/";
               if(!new File(path).isDirectory()){
                   new File(path).mkdir();
               }
               File uploadFile = new File(path+newFileName);
               try {
                   file.transferTo(uploadFile);
                   param.put("文件上传成功","200");
               } catch (IOException e) {
                   param.put("此文件上传失败,名称为:"+fileName,"201");
                   e.printStackTrace();
               }
           });
       }else{
           param.put("301","上传文件为空");
       }
        return param;
    }


        /**
         *  文件下载
         * @param request
         * @param response
         * @param fileName
         * @return
         */
    @GetMapping("/downLoadFile")
  public Map downLoadFile(HttpServletRequest request, HttpServletResponse response, @RequestParam("fileName") String fileName,@RequestParam("id")  String id){
     Map param = new HashMap<>();
      /**
       * 在实际项目开发中,要传与文件相关联的数据id,
       * 根据id查出这条数据,这条数据当然包括 原文件名称,和新文件名称,
       *
       * 有可能是其他类型的文件下载,可能是一个列表全部是文件,那样只要传文件名称就可以。
       */
        if(id!=null){
            // 查询数据库这条数据,得到新文件名称。
            String newFileName = "86f8e7e9-e043-4947-a578-0a0628c20b5b.doc";
            //获取文件地址, 这个地址也可以在配置文件中配置,用@Value 拿路径
        //    String realPath = request.getSession().getServletContext().getRealPath("/uploadFile/");

            String path = "F:/image123123/";
            //组装文件路径+新文件名称
            String filePath = path+newFileName;
            //创建文件类
            File file = new File(filePath);
            //  response.setContentType("application/force-download");
            // 设置下载文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + newFileName);
            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream os = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
                param.put("200","下载成功");
                return param;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
      return null;
  }

 

另外springboot 设置文件上传大小可以自定义一个springboot组件加入以下代码,创建一个类,在类上添加 

@Configuration注解,并且添加一下代码
    /**
     * 限制上传文件大小
     */
   @Bean
            public MultipartConfigElement multipartConfigElement(){
                MultipartConfigFactory factory = new MultipartConfigFactory();
                //单个文件最大 5m 可以使用读取配置
                factory.setMaxFileSize(DataSize.parse("5120KB")); //KB,MB
                /// 设置总上传数据总大小 50m
                factory.setMaxRequestSize(DataSize.parse("512000KB"));
                return factory.createMultipartConfig();
            }

 

springBoot 实现文件上传下载(多文件上传)_第2张图片

另外一种方式是在配置文件中添加

spring:
  servlet:
    multipart:
      enabled: true #是否启用http上传处理
      max-request-size: 1026KB #最大请求文件的大小
      max-file-size: 1026KB #设置单个文件最大长度
      file-size-threshold: 20MB #当文件达到多少时进行磁盘写入

 

 

你可能感兴趣的:(文件上传下载)