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;
}}springboot 获取压缩文件树
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
下一篇:微服务ddd代码结构
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Linux压缩和解压文件
Linux压缩和解压文件
压缩文件 7z linux 解压 -
springBoot集成压缩文件上传
很慢。所以我们需要通过压缩文件上传,然后存起来。
java 上传 压缩文件 文件名
















