package com.chuanghai.ihotel.controller; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.common.utils.BinaryUtil; import com.aliyun.oss.model.MatchMode; import com.aliyun.oss.model.PolicyConditions; import com.chuanghai.ihotel.common.exception.BizCodeEnume; import com.chuanghai.ihotel.common.exception.RRException; import com.chuanghai.ihotel.common.utils.CommonResult; import com.chuanghai.ihotel.vo.AliyunOssPolicyVO; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Date; @RestController @RequestMapping("oss") public class OssController { @Value("${aliyun.oss.endpoint}") private String endpoint; @Value("${aliyun.oss.bucket}") private String bucket; @Value("${aliyun.oss.access-key}") private String accessKey; @Value("${aliyun.oss.secret-key}") private String accessKeySecret; /** * 获取上传文件签名 * @apiNote 用于文件上传时获取上传文件签名,采用服务器签名后直传的方式进行文件上传, * 具体文档参考:https://help.aliyun.com/document_detail/31926.html */ @GetMapping("/aliyun/policy") public CommonResult policy() { String host = "https://" + bucket + "." + endpoint; String dir = LocalDate.now().toString() + "/"; // 用户上传文件时指定的前缀。 // oss 客户端 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKey, accessKeySecret); try { // 过期时间 LocalDateTime expireEndTime = LocalDateTime.now().plusMinutes(30); PolicyConditions policyConds = new PolicyConditions(); policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000); policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir); String postPolicy = ossClient.generatePostPolicy(Date.from(expireEndTime.toInstant(ZoneOffset.of("+8"))), policyConds); byte[] binaryData = postPolicy.getBytes("utf-8"); String encodedPolicy = BinaryUtil.toBase64String(binaryData); String postSignature = ossClient.calculatePostSignature(postPolicy); AliyunOssPolicyVO aliyunOssPolicyVO = AliyunOssPolicyVO.builder() .accessId(accessKey) .policy(encodedPolicy) .signature(postSignature) .dir(dir) .host(host) .expire(String.valueOf(expireEndTime.toEpochSecond(ZoneOffset.of("+8")))) .build(); return CommonResult.ok().setResult(aliyunOssPolicyVO); } catch (Exception e) { throw new RRException(BizCodeEnume.FILE_UPLOAD_ERROR, e.getMessage()); } finally { ossClient.shutdown(); } } }