有在公共包中创建文件上传和下载的控制类
可以在配置文件中自定义文件的存储路径,后可以在类中用@Value来获取值
reggie:
path: D:\img\
在类中可以在方法中传入MultipartFile类型的参数,并且形参的名字要和前端传过来的参数名一样
- 首先通过MultipartFile类中的getOriginalFilename()获取文件的原始文件名,获取后缀
- 通过UUID重新声明文件名并覆盖
- 通过@Value获取配置文件中的存储路径的值
- 将前端传过来的文件用MultipartFile的transferTo()方法转存到获取的路径中,并进行路径是否存在的判断
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
@Value("${reggie.path}")
private String basePath;
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
log.info(file.toString());
//原始文件名
String originalFilename = file.getOriginalFilename();//abc.jpg
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
String fileName = UUID.randomUUID().toString() + suffix;//dfsdfdfd.jpg
//创建一个目录对象
File dir = new File(basePath);
//判断当前目录是否存在
if(!dir.exists()){
//目录不存在,需要创建
dir.mkdirs();
}
try {
//将临时文件转存到指定位置
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
}
下载文件
可以使用IOUtils.copy()来进行直接的获取输出操作
也可以自己写
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//输出流,通过输出流将文件写回浏览器
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
但是MultipartFile默认接收的图片会有一定的大小限制,用这个方法可以自定义大小
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//指定文件代销
factory.setMaxFileSize(DataSize.ofBytes(10485760*1024));
/// 设定上传文件大小
factory.setMaxRequestSize(DataSize.ofBytes(10485760*1024));
return factory.createMultipartConfig();
}
//或者在配置文件中设置
# 设置上传文件的大小
spring:
servlet:
multipart:
enabled: true
max-file-size: 931775308
max-request-size: 1000MB