SpringBoot 上传下载

SpringBoot 上传下载
关于简单实现文件的上传下载,后端采用的是springboot框架编写,前端采用html方式;
后端包含控制层的controller与工具类FileUtil.java;

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
import org.springframework.util.unit.DataSize;
import org.springframework.util.unit.DataUnit;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.MultipartConfigElement;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.Map;

@Controller
public class FileController {

/*

  • 获取file.html页面
    */
    @RequestMapping(“file”)
    public String file(){
    return “/file”;
    }

/**

  • 实现文件上传

  • */
    @RequestMapping(“fileUpload”)
    @ResponseBody
    public Map<String,Object> fileUpload(@RequestParam(“fileName”) MultipartFile file){
    Map<String,Object> map=null;
    Boolean flag=true;
    File dest =null;
    if(file.isEmpty()){
    flag= false;
    }
    String fileName = file.getOriginalFilename();
    int size = (int) file.getSize();
    System.out.println(fileName + “–>” + size);

    String path = “F:/test” ;
    dest = new File(path + “/” + fileName);
    if(!dest.getParentFile().exists()){ //判断文件父目录是否存在
    dest.getParentFile().mkdir();
    }
    try {
    file.transferTo(dest); //保存文件
    flag= true;
    } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    flag= false;
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    flag= false;
    }
    map.put(“flag”,flag);
    map.put(“path”,dest.getPath());
    return map;
    }

/*

  • 获取multifile.html页面
    */
    @RequestMapping(“multifile”)
    public String multifile(){
    return “/multifile”;
    }

/**

  • 实现多文件上传

  • */
    @RequestMapping(value=“multifileUpload”,method= RequestMethod.POST)
    public @ResponseBody Map<String,Object> multifileUpload(HttpServletRequest request){

    List files = ((MultipartHttpServletRequest)request).getFiles(“fileName”);
    Map<String,Object> map=null;
    Boolean flag=true;
    File dest =null;
    if(files.isEmpty()){
    flag=false;
    }

    String path = “F:/test” ;

    for(MultipartFile file:files){
    String fileName = file.getOriginalFilename();
    int size = (int) file.getSize();
    System.out.println(fileName + “–>” + size);

     if(file.isEmpty()){
         flag=false;
     }else{
          dest = new File(path + "/" + fileName);
         if(!dest.getParentFile().exists()){ //判断文件父目录是否存在
             dest.getParentFile().mkdir();
         }
         try {
             file.transferTo(dest);
         }catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
             flag=false;
         }
     }
    

    }
    map.put(“flag”,flag);
    map.put(“path”,dest.getPath());
    return map;
    }

@RequestMapping("/download")
public String downLoad(HttpServletResponse response) throws UnsupportedEncodingException {
// 文件地址,真实环境是存放在数据库中的
String filename=“hdwfm.sql”;
String filePath = “F:/test” ;
File file = new File(filePath + “/” + filename);
if(file.exists()){ //判断文件父目录是否存在
response.setContentType(“application/vnd.ms-excel;charset=UTF-8”);
response.setCharacterEncoding(“UTF-8”);
// response.setContentType(“application/force-download”);
response.setHeader(“Content-Disposition”, “attachment;fileName=” + java.net.URLEncoder.encode(filename,“UTF-8”));
byte[] buffer = new byte[1024];
FileInputStream fis = null; //文件输入流
BufferedInputStream bis = null;

      OutputStream os = null; //输出流
      try {
          os = response.getOutputStream();
          fis = new FileInputStream(file);
          bis = new BufferedInputStream(fis);
          int i = bis.read(buffer);
          while(i != -1){
              os.write(buffer);
              i = bis.read(buffer);
          }


      } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
      System.out.println("----------file download---" + filename);
      try {
          bis.close();
          fis.close();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  return null;

}

}

前端页面

Insert title here

文件上传

选择文件:

multifile.html

xmlns:sec=“http://www.thymeleaf.org/thymeleaf-extras-springsecurity3”>

Insert title here

文件上传

选择文件1:

选择文件2:

选择文件3:

SpringBoot的默认上传文件的大小是2m 如果你上传的文件超过了2m就会出现错误。
这个时候我们可以再application.yml里面进行修改

第二种方法是直接在springboot的启动类里加入下面的代码。

/**

  • 文件上传配置
  • @return
    */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    //factory.setMaxFileSize(1024);
    //单个文件最大
    factory.setMaxFileSize(DataSize.of(60, DataUnit.MEGABYTES)); //KB,MB
    /// 设置总上传数据总大小
    factory.setMaxRequestSize(DataSize.of(60, DataUnit.MEGABYTES));
    return factory.createMultipartConfig();

}

上传下载工具类FileUtil.java

package com.example.demo.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**

  • 文件上传、下载、多个文件压缩下载

  • @author LW

  • @date 2020-09-11 10:40:00
    */
    @Slf4j
    public class FileUtil {

    public static String FORMAT_STRING =“yyyyMMddHHmmss”;
    /**

    • 文件上传
    • @param file
    • @return
      */
      public static boolean uploadFile(MultipartFile file,String path,Date date) {
      File targetFile = new File(path);
      if (!targetFile.exists()) {
      targetFile.mkdirs();
      }
      SimpleDateFormat format = new SimpleDateFormat(FORMAT_STRING);
      String filePath = path + format.format(date) + file.getOriginalFilename();
      try (FileOutputStream out = new FileOutputStream(filePath)) {
      out.write(file.getBytes());
      } catch (Exception e) {
      log.error(“文件上传失败!”,e);
      return false;
      }
      log.info(“文件上传成功!”);
      return true;
      }

    /**

    • 文件下载
    • @param response
    • @param fileName
    • @param filePath
      */
      public static void downloadFile(HttpServletResponse response,String fileName,String filePath) {
      File file = new File(filePath + fileName);
      if (file.exists()) {
      try (FileInputStream fis = new FileInputStream(file);
      BufferedInputStream bis = new BufferedInputStream(fis)) {
      response.setContentType(“application/octet-stream”);
      response.setHeader(“content-type”, “application/octet-stream”);
      response.setHeader(“Content-Disposition”, “attachment;fileName=” + URLEncoder.encode(fileName, “utf8”));
      byte[] buffer = new byte[1024];
      //输出流
      OutputStream os = response.getOutputStream();
      int i = bis.read(buffer);
      while (i != -1) {
      os.write(buffer);
      i = bis.read(buffer);
      }
      } catch (Exception e) {
      log.info(e.getMessage());
      }
      }
      }

    /**
    *

    • 下载多个文件压缩包

    • 可以用作web页面勾选文件列表,将勾选的文件/文件夹打包下载

    • 父文件夹与子文件夹不能有同名文件,否则会报java.util.zip.ZipException: duplicate entry

    • 因为它是遍历文件夹内所有的子文件夹,将所有文件打包到同一个zip中,同名文件会有冲突

    • @param response
      */
      public static void downloadZip(HttpServletResponse response,List fileList) {
      // List list = new ArrayList<>();
      // list.add(“D:\chandao\xampp\zentaoep\bin”);
      SimpleDateFormat format = new SimpleDateFormat(FORMAT_STRING);
      String fileName = format.format(new Date());
      // 生成压缩包
      // 关联response输出流,直接将zip包文件内容写入到response输出流并下载
      try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
      //zip文件作为附件下载
      fileName = URLEncoder.encode(fileName, “UTF-8”);
      response.setHeader(“Content-Type”, “application/zip”);
      response.setHeader(“Content-Disposition”, “attachment; filename=” + fileName);

       // 循环读取文件路径集合,获取每一个文件的路径
       for (String fp : fileList) {
           // 根据文件路径创建文件
           File file = new File(fp);
           // 将每一个文件写入zip文件包内,即进行打包
           zipFile(file, zos);
           // 刷新缓冲区
           response.flushBuffer();
       }
      

      } catch (IOException e) {
      log.error(“下载多个文件压缩包错误”,e);
      }
      }

    /**

    • 封装压缩文件的方法
    • @param inputFile
    • @param zipoutputStream
      */
      private static void zipFile(File inputFile, ZipOutputStream zipoutputStream) {
      // 创建输入流读取文件
      try(FileInputStream fis = new FileInputStream(inputFile);
      BufferedInputStream bis = new BufferedInputStream(fis)) {
      // 判断文件是否存在
      if (inputFile.exists()) {
      // 判断是否属于文件,还是文件夹
      if (inputFile.isFile()) {
      // 将文件写入zip内,即将文件进行打包
      ZipEntry ze = new ZipEntry(inputFile.getName());
      // 获取文件名
      zipoutputStream.putNextEntry(ze);
      // 写入文件的方法,同上
      byte[] b = new byte[1024];
      long l = 0;
      while (l < inputFile.length()) {
      int j = bis.read(b, 0, 1024);
      l += j;
      zipoutputStream.write(b, 0, j);
      }
      } else {
      // 如果是文件夹,则使用穷举的方法获取文件,写入zip
      try {
      File[] files = inputFile.listFiles();
      for (File file : files) {
      zipFile(file, zipoutputStream);
      }
      } catch (Exception e) {
      log.error(“压缩文件失败”,e);
      }
      }
      }
      } catch (Exception e) {
      log.error(“压缩文件异常”,e);
      }
      }

    /**

    • 删除文件
    • @param filePath
    • @return
      */
      public static boolean deleteFile(String filePath){
      boolean flag = false;
      File file = new File(filePath);
      if (!file.exists()) {
      return false;
      }
      try{
      flag = file.delete();
      }catch (Exception e){
      log.error(“文件删除错误”,e);
      }
      return flag;
      }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑾莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值