OssController.java 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package com.chuanghai.ihotel.controller;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClientBuilder;
  4. import com.aliyun.oss.common.utils.BinaryUtil;
  5. import com.aliyun.oss.model.MatchMode;
  6. import com.aliyun.oss.model.PolicyConditions;
  7. import com.chuanghai.ihotel.common.exception.BizCodeEnume;
  8. import com.chuanghai.ihotel.common.exception.RRException;
  9. import com.chuanghai.ihotel.common.utils.CommonResult;
  10. import com.chuanghai.ihotel.vo.AliyunOssPolicyVO;
  11. import org.springframework.beans.factory.annotation.Value;
  12. import org.springframework.web.bind.annotation.GetMapping;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RestController;
  15. import java.time.LocalDate;
  16. import java.time.LocalDateTime;
  17. import java.time.ZoneOffset;
  18. import java.util.Date;
  19. @RestController
  20. @RequestMapping("oss")
  21. public class OssController {
  22. @Value("${aliyun.oss.endpoint}")
  23. private String endpoint;
  24. @Value("${aliyun.oss.bucket}")
  25. private String bucket;
  26. @Value("${aliyun.oss.access-key}")
  27. private String accessKey;
  28. @Value("${aliyun.oss.secret-key}")
  29. private String accessKeySecret;
  30. /**
  31. * 获取上传文件签名
  32. * @apiNote 用于文件上传时获取上传文件签名,采用服务器签名后直传的方式进行文件上传,
  33. * 具体文档参考:https://help.aliyun.com/document_detail/31926.html
  34. */
  35. @GetMapping("/aliyun/policy")
  36. public CommonResult<AliyunOssPolicyVO> policy() {
  37. String host = "https://" + bucket + "." + endpoint;
  38. String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀。
  39. // oss 客户端
  40. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKeySecret);
  41. try {
  42. // 过期时间
  43. LocalDateTime expireEndTime = LocalDateTime.now().plusMinutes(30);
  44. PolicyConditions policyConds = new PolicyConditions();
  45. policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
  46. policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
  47. String postPolicy = ossClient.generatePostPolicy(Date.from(expireEndTime.toInstant(ZoneOffset.of("+8"))), policyConds);
  48. byte[] binaryData = postPolicy.getBytes("utf-8");
  49. String encodedPolicy = BinaryUtil.toBase64String(binaryData);
  50. String postSignature = ossClient.calculatePostSignature(postPolicy);
  51. AliyunOssPolicyVO aliyunOssPolicyVO = AliyunOssPolicyVO.builder()
  52. .accessId(accessKey)
  53. .policy(encodedPolicy)
  54. .signature(postSignature)
  55. .dir(dir)
  56. .host(host)
  57. .expire(String.valueOf(expireEndTime.toEpochSecond(ZoneOffset.of("+8"))))
  58. .build();
  59. return CommonResult.ok().setResult(aliyunOssPolicyVO);
  60. } catch (Exception e) {
  61. throw new RRException(BizCodeEnume.FILE_UPLOAD_ERROR, e.getMessage());
  62. } finally {
  63. ossClient.shutdown();
  64. }
  65. }
  66. }