application.yml中配置上传下载的文件地址,方便随时修改
reggie:
path: D:\img\
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
//获取配置中的路径地址
@Value("${reggie.path}")
private String bashPath;
//必须是post请求方式
@PostMapping("/upload")
//MultipartFile是一个缓存文件,不存储会自动消失,file名得和前端页面保持一致
public R<String> upload(MultipartFile file){
log.info(file.toString());
String originalFilename = file.getOriginalFilename();
//获取"."以及点后面的文件后缀
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
//生成新的文件名,以免上传到相同的文件发生冲突
String fileName = UUID.randomUUID().toString() + substring;
File filePath = new File(bashPath);
//判断存储路径是否存在
if(!filePath.exists()){
//不存在则自动建
filePath.mkdirs();
}
try {
//Multipart的方法直接写入文件
file.transferTo(new File(bashPath+fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
@GetMapping("/download")
//name前端存储的文件名称
public void download(String name, HttpServletResponse response){
try {
//以流的方式读文件并回显给浏览器
FileInputStream fileInputStream = new FileInputStream(bashPath + name);
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("/img/jpeg");
//设置输出流只读大小
int len=0;
byte[] bytes = new byte[2024];
//判断并循环输出文件
while ( (len = fileInputStream.read(bytes))!=-1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭流
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}