当前位置:   article > 正文

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)

接上文(亲测有效)SpringBoot项目集成腾讯云COS对象存储(1)-CSDN博客

目录

3、通用能力类

文件下载

测试


3、通用能力类

文件下载

官方文档介绍了2种文件下载方式。一种是直接下载 COS 的文件到后端服务器(适合服务器端处理文件),另一种是获取到文件下载输入流(适合返回给前端用户)。

  1. 参考官方文档:
  2. · https://cloud.tencent.com/document/product/436/65937
  3. · https://cloud.tencent.com/document/product/436/10199#.E4.B8.8B.E8.BD.BD.E5.AF.B9.E8.B1.A1

其实还有第三种"下载方式”,直接通过路径链接访问,适用于单一的、可以被用户公开访问的资源,比如用户头像、代码生成器文件。

但是对于代码生成器产物包文件,更建议通过后端服务器从COS下载文件并返回给前端,这样可以在后端限制只有登录用户才能下载。

(1)首先在 CosManager 中新增对象下载方法getObject(),根据对象的 key 获取存储信息.

  1. import com.qcloud.cos.COSClient;
  2. import com.qcloud.cos.model.COSObject;
  3. import com.qcloud.cos.model.GetObjectRequest;
  4. import com.qcloud.cos.model.PutObjectRequest;
  5. import com.qcloud.cos.model.PutObjectResult;
  6. import com.waterai.water.config.CosClientConfig;
  7. import java.io.File;
  8. import javax.annotation.Resource;
  9. import org.springframework.stereotype.Component;
  10. /**
  11. * Cos 对象存储操作
  12. */
  13. @Component
  14. public class CosManager {
  15. @Resource
  16. private CosClientConfig cosClientConfig;
  17. @Resource
  18. private COSClient cosClient;
  19. /**
  20. * 上传对象
  21. * @param key 唯一键
  22. * @param localFilePath 本地文件路径
  23. * @return
  24. */
  25. public PutObjectResult putObject(String key, String localFilePath) {
  26. PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key, new File(localFilePath));
  27. return cosClient.putObject(putObjectRequest);
  28. }
  29. /**
  30. * 上传对象
  31. * @param key 唯一键
  32. * @param file 文件
  33. * @return
  34. */
  35. public PutObjectResult putObject(String key, File file) {
  36. PutObjectRequest putObjectRequest = new PutObjectRequest(cosClientConfig.getBucket(), key, file);
  37. return cosClient.putObject(putObjectRequest);
  38. }
  39. /*
  40. * 下载对象
  41. * @param key 唯一键
  42. * @return
  43. * */
  44. public COSObject getObject(String key) {
  45. GetObjectRequest getObjectRequest = new GetObjectRequest(cosClientConfig.getBucket(), key);
  46. return cosClient.getObject(getObjectRequest);
  47. }
  48. }

测试

(1)为了方便测试,在 FileController 中编写测试文件下载接口。

核心流程是根据路径获取到COS 文件对象,然后将文件对象转换为文件流,并写入到 Servlet的Response 对象中。

注意要设置文件下载专属的响应头。同上,测试接口一定要加上管理员权限!防止任何用户随意上传文件。

测试文件下载接口代码如下:

  1. import cn.hutool.core.io.FileUtil;
  2. import com.waterai.water.annotation.AuthCheck;
  3. import com.waterai.water.common.BaseResponse;
  4. import com.waterai.water.common.ErrorCode;
  5. import com.waterai.water.common.ResultUtils;
  6. import com.waterai.water.constant.FileConstant;
  7. import com.waterai.water.constant.UserConstant;
  8. import com.waterai.water.exception.BusinessException;
  9. import com.waterai.water.manager.CosManager;
  10. import com.waterai.water.model.dto.file.UploadFileRequest;
  11. import com.waterai.water.model.entity.User;
  12. import com.waterai.water.model.enums.FileUploadBizEnum;
  13. import com.waterai.water.service.UserService;
  14. import java.io.File;
  15. import java.util.Arrays;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletRequest;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.commons.lang3.RandomStringUtils;
  20. import org.springframework.web.bind.annotation.PostMapping;
  21. import org.springframework.web.bind.annotation.RequestMapping;
  22. import org.springframework.web.bind.annotation.RequestPart;
  23. import org.springframework.web.bind.annotation.RestController;
  24. import org.springframework.web.multipart.MultipartFile;
  25. /**
  26. * 文件接口
  27. */
  28. @RestController
  29. @RequestMapping("/file")
  30. @Slf4j
  31. public class FileController {
  32. @Resource
  33. private UserService userService;
  34. @Resource
  35. private CosManager cosManager;
  36. /*
  37. * 其他方法。。。。。
  38. * */
  39. /*
  40. * 测试文件上传
  41. * */
  42. @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
  43. @PostMapping("/test/upload")
  44. public BaseResponse<String> testUploadFile(@RequestPart("file") MultipartFile multipartFile) {
  45. // 文件目录
  46. String filename = multipartFile.getOriginalFilename();
  47. String filepath = String.format("/test/%s", filename);
  48. File file = null;
  49. try {
  50. //上传文件
  51. file = File.createTempFile(filepath, null);
  52. multipartFile.transferTo(file);
  53. cosManager.putObject(filepath, file);
  54. //返回可访问地址
  55. return ResultUtils.success(filepath);
  56. } catch (Exception e) {
  57. System.out.println("file upload error, filepath = " + filepath + ", error = " +e);
  58. throw new BusinessException(ErrorCode.SYSTEM_ERROR, "上传失败");
  59. } finally {
  60. if (file != null) {
  61. //删除临时文件
  62. boolean delete = file.delete();
  63. if (!delete) System.out.println("file delete error, filepath = [l" + filepath);
  64. }
  65. }
  66. }
  67. /*
  68. * 测试文件下载
  69. */
  70. @AuthCheck (mustRole = UserConstant.ADMIN_ROLE)
  71. @GetMapping("/test/download/")
  72. public void testDownloadFile(String filepath, HttpServletResponse response) throws IOException {
  73. COSObjectInputStream cosObjectInput = null;
  74. try {
  75. COSObject cosObject = cosManager.getObject(filepath);
  76. cosObjectInput = cosObject.getObjectContent();
  77. //处理下载到的流
  78. byte[] bytes = IOUtils.toByteArray(cosObjectInput);
  79. //设置响应头
  80. response.setContentType("application/octet-stream;charset=UTF-8");
  81. response.setHeader("Content-Disposition", "attachment; filename=" + filepath);
  82. //写入响应
  83. response.getOutputStream().write(bytes);
  84. response.getOutputStream().flush();
  85. } catch (Exception e) {
  86. log.error("file download error, filepath = " + filepath, e);
  87. throw new BusinessException(ErrorCode.SYSTEM_ERROR, "下载失败");
  88. } finally {
  89. if (cosObjectInput != null) cosObjectInput.close();
  90. }
  91. }
  92. }

(2)修改启动配置李的active profiles,使用local配置启动项。

然后点击启动按钮启动项目。

(3)打开 Swagger接口文档,此处我的项目端口是8101,因此就是http://localhost:8101/api/doc.html,然后在file-controller中找到测试文件上传的这个接口,开始进行测试。

首先,点击选择文件,从本地选择一个文件,然后点击发送请求。

就可以看到5.jpg这个文件下载的请求返回成功了。没报错,但就是不知道为什么图片不显示。

至此,后端操作对象存储的代码已编写完成。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/993385
推荐阅读
相关标签
  

闽ICP备14008679号