文章目录
基于Spring Boot的文件上传下载功能模块的设计与实现
1、前言
2021年的5月份,那时的我大二,受某个学校的老师之托,帮助学校的某个学院做一个系统《创新项目申报管理支持系统》,功能是管理学校的双创项目,能实现项目从申报到结题等等一系列的操作。团队成员一共4个,2个后端+2个前端,我作为项目组长并且负责后端功能的实现,其中有一部分的功能就是文件(PDF、Word、图片……)等资源的上传与下载,当时的我对这些很迷糊,不知道如何去实现,于是就学了一段时间。
整个系统历时9个月,因为都是学生嘛,加上做学校用得系统,不断地调研,分析需求,所以做的比较慢,一直上线测试,然后就调式改BUG,最后系统能基本实现学校的要求,文件上传下载这个模块功能也是很好地实现,我将系统中的文件上传和下载的功能模块抽出来(因为我不知道原系统能否分享,毕竟是帮学校做的),特此分享。
为了更好地演示,搭了个很丑的页面,但是后端只需要关注业务逻辑怎么实现即可,实际开发过程中,会有前端小姐姐去美化界面的,我们要做的就是实现功能即可。
源码下载:下载链接:《基于SpringBoot的文件上传下载功能模块的设计与实现.zip》。
代码中基本都写了很详细的注释。
2、技术栈
Spring Boot+MyBatis+Thymeleaf+JSP
3、关键源码
其实,FileController.java就已经实现了最主要的业务功能了,剩下的就是数据库的增删改查了,我相信那些肯定没什么难度吧啊哈哈哈~
@Controller
@RequestMapping("/file")
public class FileController {
@Autowired
private UserFileService userFileService;
@Value("${upload.dir}")
private String uploadPath;
/**
* 返回当前用户的所有文件列表---json格式数据
*/
@GetMapping("/findAllJSON")
@ResponseBody
public List<UserFile> findAllJSON(HttpSession session, Model model) {
//在登录的session中获取用户的id
User user = (User) session.getAttribute("user");
//根据用户id查询有的文件信息
List<UserFile> userFiles = userFileService.findByUserId(user.getId());
return userFiles;
}
/**
* 删除文件信息
*/
@GetMapping("/delete")
public String delete(String id) throws FileNotFoundException {
//根据id查询信息
UserFile userFile = userFileService.findById(id);
//删除文件
String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();
File file = new File(realPath, userFile.getNewFileName());
if (file.exists()) {
file.delete();//立即删除
}
//删除数据库中记录
userFileService.delete(id);
return "redirect:/file/showAll";
}
/**
* 文件下载
*/
@GetMapping("/download")
public void download(String openStyle, String id, HttpServletResponse response) throws IOException {
//获取打开方式
openStyle = openStyle == null ? "attachment" : openStyle;
//获取文件信息
UserFile userFile = userFileService.findById(id);
//点击下载链接更新下载次数
if ("attachment".equals(openStyle)) {
userFile.setDowncounts(userFile.getDowncounts() + 1);
userFileService.update(userFile);
}
//根据文件信息中文件名字 和 文件存储路径获取文件输入流
String realpath = uploadPath + userFile.getPath();
//获取文件输入流
FileInputStream is = new FileInputStream(new File(realpath, userFile.getNewFileName()));
//附件下载
response.setHeader("content-disposition", openStyle + ";fileName=" + URLEncoder.encode(userFile.getOldFileName(), "UTF-8"));
//获取响应输出流
ServletOutputStream os = response.getOutputStream();
//文件拷贝
IOUtils.copy(is, os);
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
/**
* 上传文件处理 并保存文件信息到数据库中
*/
@PostMapping("/upload")
public String upload(@RequestParam(value = "uploadFile") MultipartFile uploadFile,
HttpSession session) throws IOException {
//获取上传文件用户id
User user = (User) session.getAttribute("user");
//获取文件原始名称
String oldFileName = uploadFile.getOriginalFilename();
//获取文件后缀
String extension = "." + FilenameUtils.getExtension(uploadFile.getOriginalFilename());
//生成新的文件名称
String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-", "") + extension;
//文件大小
Long size = uploadFile.getSize();
//文件类型
String type = uploadFile.getContentType();
//处理根据日期生成目录
//String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static/files";
String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dateDirPath = uploadPath + "/files/" + dateFormat;
File dateDir = new File(dateDirPath);
if (!dateDir.exists()) {
dateDir.mkdirs();
}
//处理文件上传
uploadFile.transferTo(new File(dateDir, newFileName));
//将文件信息放入数据库保存
UserFile userFile = new UserFile();
userFile.setOldFileName(oldFileName)
.setNewFileName(newFileName)
.setExt(extension)
.setSize(String.valueOf(size))
.setType(type)
.setPath("/files/" + dateFormat)
.setUserId(user.getId());
userFileService.save(userFile);
return "redirect:/file/showAll";
}
/**
* 展示所有文件信息
*/
@GetMapping("/showAll")
public String findAll(HttpSession session, Model model) {
//在登录的session中获取用户的id
User user = (User) session.getAttribute("user");
//根据用户id查询有的文件信息
List<UserFile> userFiles = userFileService.findByUserId(user.getId());
//存入作用域中
model.addAttribute("files", userFiles);
return "showAll";
}
}
4、实现效果
4.1、登录
根据用户信息来查看用户上传了哪些文件。
4.2、文件列表
4.3、上传文件测试
4.3.1、测试图片
查看文件夹:
查看数据库:
4.3.2、文档
上传:
文件夹:
数据库:
4.4、预览和下载文件测试
点击左侧的操作按钮,选择功能:
4.4.1、图片预览和下载
图片预览:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jWunLgGv-1657444882098)(E:\File\Blog\项目\5_功能实战之文件上传下载\文件上传下载.assets\image-20220710171047486.png)]
图片下载:
4.4.2、文档预览和下载
文档预览:
文档下载:
5、源码下载
可以根据关键源码的FileController.java去理解,其实已经能实现80%的功能了,剩下20%就是数据库操作了,若想直接拿源码,则点击下载即可。