知识储备
1.在yml文件中调用常量,在类中引用
files:
upload:
path: C:\Users\86150\Desktop\项目集合\files\
@Value("${files.upload.path}")
private String path;
2. MultipartFile 类型用于接收文件类型
public Result upload(@RequestParam MultipartFile file)
3.StrUtil.DOT 为hutool的工具类方法翻译为“.”
4.在返回文件类型的时候,一般在参数中写下HttpServletResponse response用于返回数据
public void download( HttpServletResponse response)
如何上传图片?
思路:把图片放到磁盘上,如何把url写到数据库中存起来
controller层
@RestController
@RequestMapping("/files")
public class FilesController {
//这个为磁盘的路径
@Value("${files.upload.path}")
private String path;
@Resource
private IFilesService filesService;
//实现上传方法
@PostMapping("/upload")
public Result upload(@RequestParam MultipartFile file) {
//通过调用这个方法,将文件写到磁盘中,并返回文件的url,功能在service层实现
String url = filesService.saveDisk(file);
//建一个实体类对象,把获取到的url,名字放到对象中
Files files = new Files();
files.setUrl(url);
files.setName(file.getOriginalFilename());
//将获取到的对象写入数据库中
try {
filesService.save(files);
}catch (Exception e){
throw new LoginException(Constants.CODE_500,"文件写入失败");
}
//成功
return Result.success();
}
}
service层
中具体事项方法saveDisk方法
package com.example.mybatis_plus_generator.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.example.mybatis_plus_generator.entity.Files;
import com.example.mybatis_plus_generator.mapper.FilesMapper;
import com.example.mybatis_plus_generator.service.IFilesService;
@Service
public class FilesServiceImpl extends ServiceImpl<FilesMapper, Files> implements IFilesService {
@Value("${files.upload.path}")
private String path;
//service层中具体完成写入磁盘功能
public String saveDisk(MultipartFile file){
//获取文件的原始名字和类型
String originalFilename = file.getOriginalFilename();
String type = FileUtil.extName(originalFilename);
//通过hutool的工具类IdUtil生成唯一的字符串,用于识别
String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT+type;
//获取到传进来文件的文件位置
File uploadFile = new File(path + fileUUID);
//获取到传进来文件的文件夹,若不存在的话就创建一个
File parentFile = new File(path);
if (!parentFile.exists()){
parentFile.mkdirs();
}
//将传进来的文件传到文件夹中
try {
file.transferTo(uploadFile);
} catch (IOException e) {
e.printStackTrace();
}
//返回该文件的路径和文件名,方便调用
return "http://localhost:8080/file/"+fileUUID;
}
}
测试
如何接收文件?
//这个为磁盘的路径
@Value("${files.upload.path}")
private String path;
@GetMapping("/{fileUUID}")
public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
// 根据文件的唯一标识码获取文件
File uploadFile = new File(path + fileUUID);
// 设置输出流的格式
ServletOutputStream os = response.getOutputStream();
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileUUID, "UTF-8"));
response.setContentType("application/octet-stream");
// 读取文件的字节流
try {
os.write(FileUtil.readBytes(uploadFile));
} catch (Exception e) {
System.err.println("文件下载失败,文件不存在");
}
os.flush();
os.close();
}