文件上传
在springboot中,上传文件只需要在接口中通过 MultipartFile 对象来获取前端传递的数据,然后将数据存储,并且返回一个对外访问路径即可。一般对于上传文件的文件名,都要通过uuid进行处理。
@RestController
@RequestMapping("/file")
public class FileController {
// 服务器存储位置
private static String parentPath = "D:\\IdeaProjects\\demoZ\\src\\main\\resources\\static\\";
// 上传接口
@RequestMapping("/upload")
public String uploadFile(@RequestParam MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename(); // 获取文件名
String type = file.getContentType(); // 获取文件类型
long size = file.getSize(); // 获取文件大小
// 这里只对一种类型进行了简单判断,可以自行修改
if ("image/jpeg".equals(type)){
type = ".jpg";
}
// 构建uuid作为唯一标识
String uuid = UUID.randomUUID().toString()+type;
File uploadFile = new File(parentPath+uuid);
// 判断父级目录是否存在,不存在则创建
File parentFile = uploadFile.getParentFile();
if(!parentFile.exists()){
parentFile.mkdirs();
}
// 文件存储到磁盘上
file.transferTo(uploadFile);
// 返回对外访问路径
return "http://localhost:9090/file/"+uuid;
}
}
文件下载
文件下载的话,只需要在接口中传入文件的uuid名称,然后通过流的方式直接输出即可。
@RestController
@RequestMapping("/file")
public class FileController {
private static String parentPath = "D:\\IdeaProjects\\demoZ\\src\\main\\resources\\static\\";
// 文件上传接口....
// 文件下载接口
@RequestMapping("/{uuid}")
public void download(@PathVariable String uuid, HttpServletResponse response) throws IOException {
// 通过response将数据输出
// 根据文件的唯一标识码获取文件
File uploadFile = new File(parentPath+uuid);
// 设置输出流的格式
ServletOutputStream os = response.getOutputStream();
response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(uuid,"UTF-8"));
response.setContentType("application/octet-stream");
// 创建文件输入流
FileInputStream fis = new FileInputStream(uploadFile);
// 读取文件的字节流
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen=fis.read(buf))!=-1){
// 边读边写
os.write(buf,0,readLen);
}
os.flush();
os.close();
}
}
tips:通过文件上传的返回值即可测试下载接口 http://localhost:9090/file/59038923-ea78-40df-970e-70f49dc966b3.jpg
这里的话,为了简单就只写了后端的文件上传和下载,没有涉及到数据库的文件信息存储,正常情况下是根据你文件的唯一标识去获取下载这张图片的url地址的。(不过接口写的没问题哈)