文件上传
实现策略
将文件上传到指定路径,并将文件的路径信息存储到数据库中
文件上传前台
<form th:action="@{/file/upload}" method="post" enctype="multipart/form-data">
文件上传:<input class="layui-btn" type="file" name="file" />
<input type="submit" value="提交" />
</form>
界面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FwWFHtAW-1654847887100)(C:\Users\Leo\AppData\Roaming\Typora\typora-user-images\1654847488829.png)]
后台
//文件上传
@PostMapping("/file/upload")
public String file(MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());//文件名
System.out.println(file.getContentType());//文件类型
System.out.println(file.getSize());//文件大小
System.out.println(file.getInputStream());//文件的输入流
//获得文件上传的路径
String path = ResourceUtils.getURL("classpath:").getPath()+"/static/files";
System.out.println(path);
java.io.File newFile=new java.io.File(path);//由于自定义的实体类和java.io.File重名
//文件夹不存在则重建
if(!newFile.exists()){
newFile.mkdirs();
}
//上传
String fileName=file.getOriginalFilename();
file.transferTo(new java.io.File(newFile,fileName));
//将文件上传的url存入数据表中
System.out.println("文件上传成功");
Date date = new Date();
Timestamp time = new Timestamp(date.getTime());//mysql中的日期格式
File file1=new File(fileName,path,time);
fileService.addFile(file1);//调用service方法 将文件信息插入数据库
return "redirect:/file";
}
可以在配置文件中对上传文件的大小等进行限制
文件下载
后台
//文件的下载
@GetMapping("/file/download/{fileId}")
public String fileDownload(@PathVariable("fileId") int fileId, HttpServletResponse response) throws IOException {
File file = fileService.queryFileById(fileId);
// 获得待下载文件所在文件夹的绝对路径
String realPath =file.getUrl();
//获得输入流
FileInputStream inputStream = new FileInputStream(new java.io.File(realPath, file.getFileName()));
// 设置响应头、以附件形式打开文件
response.setHeader("content-disposition", "attachment; fileName=" + file.getFileName());
//获得输出流对象
ServletOutputStream outputStream = response.getOutputStream();
int len = 0;
byte[] data = new byte[1024];
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}
outputStream.close();
inputStream.close();
return "redirect:/file";
}