文件上传与文件下载

刺骨的言语ヽ痛彻心扉 2023-10-12 15:02 81阅读 0赞

文件上传与文件下载
在开发中项目难免会遇到文件上传和下载的情况,如果公司有部署文件服务器是再好不过啦,直接调用文件服务器上传和下载的接口,保留返回的文件id即可。
但是如果公司没有文件服务器就比较苦逼了,得手写文件上传和下载的接口把文件存储在服务器的某个位置,以便使用。
直接把代码贴出来以供记录笔记。
首先controller层

  1. @ApiOperation(value = "文件上传", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  2. @PostMapping("/file/upload")
  3. @Transactional(rollbackFor = Exception.class)
  4. public ApiResult<String> upload(@RequestPart("file") MultipartFile file) {
  5. try {
  6. TFileUploadDet fileUpload = FileManageUtil.upload(file);
  7. return ApiResult.data(fileUpload.getId());
  8. } catch (Exception e) {
  9. log.error(e.getMessage(),e);
  10. return ApiResult.fail(e.getMessage());
  11. }
  12. }

然后服务层

  1. public static TFileUploadDet upload(MultipartFile file) {
  2. Assert.notNull(file, "文件不能为空");
  3. //获取上传文件名称
  4. String originalFilename = file.getOriginalFilename();
  5. //获取文件后缀名
  6. String suffix = originalFilename.substring(originalFilename.lastIndexOf('.'));
  7. String extName = suffix.substring(1);
  8. //校验文件格式是否为规定
  9. Assert.isTrue(WjlxEnum.WJLX999.getExtNameList().contains(extName),"文件类型仅支持jpg/mp4/pdf,请确认!");
  10. String id = SecureUtil.md5(originalFilename + IdUtil.getSnowflakeNextIdStr());
  11. String fileName = id + suffix;
  12. String year = DateUtil.format(new Date(), "yyyy");
  13. String today = DateUtil.format(new Date(), "yyyy-MM-dd");
  14. //获取文件存储路径
  15. String fileId = File.separator + year + File.separator + today + File.separator + fileName;
  16. Path path = Paths.get(filePath(fileId));
  17. //创建文件夹(存在文件夹就直接存在该文件夹下没有文件夹就先创建文件夹在保存)
  18. FileUtil.mkParentDirs(path);
  19. InputStream inputStream = null;
  20. OutputStream outputStream = null;
  21. //文件流上传文件
  22. try {
  23. inputStream = file.getInputStream();
  24. outputStream = Files.newOutputStream(path);
  25. IoUtil.copy(inputStream, outputStream);
  26. //一下为自定义返回参数,视情况而定
  27. TFileUploadDet fileUpload = new TFileUploadDet();
  28. fileUpload.setId(id);
  29. fileUpload.setWjmc(originalFilename);
  30. fileUpload.setWjlj(path.toString());
  31. fileUpload.setCreateTime(new Date());
  32. return fileUpload;
  33. } catch (IOException e) {
  34. throw new RuntimeException("文件上传失败", e);
  35. } finally {
  36. IoUtil.close(outputStream);
  37. IoUtil.close(inputStream);
  38. }
  39. }
  40. /**
  41. * 获取完整的文件路径
  42. *
  43. * @param fileId 文件唯一标识
  44. * @return 文件路径
  45. */
  46. public static String filePath(String fileId) {
  47. return uploadFilePath + fileId;
  48. }

注:需要注意的是 获取完整文件路径方法中的 uploadFilePath :是文件将要保存在服务器中的位置路径,可以在配置文件中配置好后引用。最后把返回的信息存在在表中使用。整个文件上传就完成了。其中用到了hutool的第三方包我使用的版本为5.8.6

  1. <dependency>
  2. <groupId>cn.hutool</groupId>
  3. <artifactId>hutool-core</artifactId>
  4. <version>5.8.6</version>
  5. </dependency>

文件下载

这个就没有什么好说的了,比较简单,就是流的操作而已。传入的参数为文件上传是保存的文件的id即可。

  1. @ApiOperation(value = "通过文件id下载文件")
  2. @PostMapping("/downloadById")
  3. public void downloadFileById(HttpServletRequest request, HttpServletResponse response, @RequestBody @Valid IdDTO idDTO) {
  4. String id = idDTO.getId();
  5. Assert.isTrue(StringUtils.isNotEmpty(id), "主表id不能为空");
  6. TFile tFile = fileService.getById(id);
  7. Assert.notNull(tFile, "要下载的文件不存在");
  8. String fileName = tFile.getFileName();
  9. request.getSession();
  10. //获取页面输出流
  11. try (ServletOutputStream out = response.getOutputStream()) {
  12. String path = tFile.getFileLink();
  13. File file = new File(path);
  14. byte[] bytes = FileUtils.readFileToByteArray(file);
  15. // 设置响应头
  16. response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
  17. response.addHeader("Pargam", "no-cache");
  18. response.addHeader("Cache-Control", "no-cache");
  19. out.write(bytes);
  20. out.flush();
  21. } catch (IOException e) {
  22. log.error(e.getMessage());
  23. throw new RuntimeException("下载文件出错");
  24. }
  25. }

学习笔记仅供参考!

发表评论

表情:
评论列表 (有 0 条评论,81人围观)

还没有评论,来说两句吧...

相关阅读

    相关 文件下载

    文件上传与下载 > 文件上传也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微

    相关 文件下载

    文件的上传与下载 文件的上传与下载在web应用中是非常常用,也是非常有用的。 例如:发送电子邮件时上传附件,下载网上资源时。 一、文件的上传 主要分为两个步骤:  

    相关 SFTP文件下载

    一、文件上传 说明1:所谓上传window上的文件上传到linux上 说明2:上传的文件会自动放到当前的用户的家目录 1:打开SFTP的窗口 Alt+p ![1297