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=” + .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 .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;
 }}