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;
}
}
前端页面
文件上传
选择文件:
multifile.html
xmlns:sec=“http://www.thymeleaf.org/thymeleaf-extras-springsecurity3”>
文件上传
选择文件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;
}
}