先创建一个MultipartFileConfig类,设置MultipartFile工具类配置信息
通过MultipartFile工具类来实现文件的上传下载与删除,MultipartFile是Spring框架提供简化上传操作的一个工具类
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;
import javax.servlet.MultipartFileConfigElement;
/**
* MultipartFile配置
*/
@Configuration
public class MultipartFileConfig {
@Bean
public MultipartConfigElement getMultipartConfig() {
MultipartConfigFactory config = new MultipartConfigFactory();
config.setMaxRequestSize(DataSize.parse("10MB"));//单次上传的单个文件大小上限(默认1MB)
config.setMaxRequestSize(DataSize.parse("100MB"));//单次上传的多个文件总大小上限
//上面两个最好配置一下,下面两个看个人喜好
// config.setFileSizeThreshold(DataSize.parse("10MB"));//临时目录中文件大小大于指定值则将数据写入硬盘
// config.setLocation("/");//保存文件临时目录
return config.createMultipartConfig();
}
}
文件的上传下载与删除方法实现
方法中用到了自动关闭io流(Java7及以上才支持)
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;
/**
* 文件上传,下载和删除
*/
public class MultipartFileHandler {
//配置文件保存路径(可以修改成任意路径,看个人喜好)
private static final String basePath = System.getProperty("user.dir") + "\\src\\main\\resources\\static\\images\\";
/**
* 上传文件
* @param file 文件
* @param customSuffix 自定义文件后缀
* @return 成功则返回文件名
*/
public static String uploadFile(MultipartFile file,String customSuffix){
if(file.isEmpty()) {
return "文件为空";
}else if(file.getSize() > 1024*1024*10){
return "文件大于10M";
}
//判断是否应该创建保存文件的目录
File dir = new File(basePath);
if(!dir.exists()){
dir.mkdirs();
}
//生成新文件名(避免出现重复的文件名导致文件被覆盖)
String fileName = UUID.randomUUID().toString().replaceAll("-", "") + customSuffix;
try {
file.transferTo(new File(basePath + fileName));//保存文件
}catch (IOException e){
e.printStackTrace();
return "上传出错";
}
return fileName;
}
/**
* 下载文件
* @param response
* @param fileName 文件名
* @param contentType 响应的HTTP内容类型
* @return
*/
public static String downloadFile(HttpServletResponse response,String fileName,String contentType){
File dir = new File(basePath + fileName);
//传输文件
if(dir.exists()){
try (FileInputStream fileInputStream = new FileInputStream(new File(basePath + fileName));
ServletOutputStream outputStream = response.getOutputStream()){
response.setContentType(contentType);
int len;
byte[] bytes = new byte[1024];
while((len = fileInputStream.read(bytes))!= -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
return "上传成功";
}else {
return "文件不存在";
}
}
/**
* 删除文件
* @param fileName 文件名
* @return
*/
public static String deleteFile(String fileName){
File dir = new File(basePath + fileName);
//isFile()判断是否是文件,exists()判断该文件是否存在,delete()删除成功返回1失败则返回0
if(dir.isFile() && dir.exists() && dir.delete()) {
return "删除成功";
}else {
return "文件不存在";
}
}
}
创建一个Controller来调用MultipartFileHandler中的方法
import com.blog.zeroBlog.common.MultipartFileHandler;
import com.blog.zeroBlog.common.Result;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/image")
public class ImageController {
//上传图片
@PostMapping("/uploadImage")
public String uploadImage(@RequestParam("file") MultipartFile file){
if(file.isEmpty()) { return "文件为空"; }
//获取文件后缀
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String[] suffixes = new String[]{//常见图片后缀集合
".jpeg",
".jpg",
".png",
".bmp"
};
boolean bool = false;
for(String string : suffixes){//判断后缀是否是常见图片后缀集合中的后缀
if (string.equals(suffix)){
bool = true;
}
}
if(bool){
return MultipartFileHandler.uploadFile(file,".jpg");//(以.jpg格式)保存图片并返回文件名
}else {
return "图片格式错误";
}
}
//下载图片
@GetMapping ("/downloadImage")
public String downloadImage(HttpServletResponse response, @RequestParam("fileName") String fileName){
String contentType = "image/jpeg";
MultipartFileHandler.downloadFile(response,fileName,contentType);//下载文件
return null;
}
//删除图片
@PostMapping("/deleteImage")
public String deleteImage(@RequestParam("fileName") String fileName){
return MultipartFileHandler.deleteFile(fileName);//删除文件并返回结果
}
}
功能演示
演示中用到的软件是Apifox
上传图片
上传格式错误的图片
下载图片
删除图片
*注:文中MultipartFile工具类的调用代码仅支持SpringBoot 3以下,SpringBoot 3及以上的源码改了,所以调用方法和文中不一样,我个人使用的是SpringBoot 2.7.6