基于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;
@GetMapping("/findAllJSON")
@ResponseBody
public List<UserFile> findAllJSON(HttpSession session, Model model) {
User user = (User) session.getAttribute("user");
List<UserFile> userFiles = userFileService.findByUserId(user.getId());
return userFiles;
}
@GetMapping("/delete")
public String delete(String id) throws FileNotFoundException {
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 {
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 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) {
User user = (User) session.getAttribute("user");
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%就是数据库操作了,若想直接拿源码,则点击下载即可。
下载链接:《基于SpringBoot的文件上传下载功能模块的设计与实现.zip》。
|