Java OSS管理

Java Oss管理

1、OssController

import xyz.xpsh.common.api.CommonResult;
import xyz.xpsh.common.model.oss.OssCallbackResult;
import xyz.xpsh.common.model.oss.OssPolicyResult;
import xyz.xpsh.server.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
/**
 * Oss相关操作接口, 图片上传由VUE执行,本接口只负责生成签名
 *
 * @author 彭林生 xpsh696@163.com
 * @version 1.0
 * @date 2021/2/23 16:44
 */
 // Oss管理
@Slf4j
@Controller
@RequestMapping("/aliyun/oss")
public class OssController {
    @Autowired
    private OssService ossService;
    //oss上传签名生成
    @RequestMapping(value = "/policy", method = RequestMethod.GET)
    @ResponseBody
    public CommonResult<OssPolicyResult> policy() {
        log.info("policy1");
        OssPolicyResult result = ossService.policy();
        log.info("policy2");
        return CommonResult.success(result);
    }
    //oss上传成功回调
    @RequestMapping(value = "callback", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult<OssCallbackResult> callback(HttpServletRequest request) {
        log.info("callback1");
        OssCallbackResult ossCallbackResult = ossService.callback(request);
        log.info("callback2");
        return CommonResult.success(ossCallbackResult);
    }
}

2、OssService

import xyz.xpsh.common.model.oss.OssCallbackResult;
import xyz.xpsh.common.model.oss.OssPolicyResult;

import javax.servlet.http.HttpServletRequest;

/**
 * oss上传管理Service
 * @author 彭林生 xpsh696@163.com
 * @version 1.0
 * @date 2021/2/23 15:49
 */
public interface OssService {
    /**
     * oss上传策略生成
     */
    OssPolicyResult policy();

    /**
     * oss上传成功回调
     */
    OssCallbackResult callback(HttpServletRequest request);

    /**
     * 外网地址转内网
     *
     * @param path
     * @return
     */
    String changeInsidePath(String path);
}

3、OssServiceImpl

import xyz.xpsh.common.model.oss.OssCallbackParam;
import xyz.xpsh.common.model.oss.OssCallbackResult;
import xyz.xpsh.common.model.oss.OssPolicyResult;
import xyz.xpsh.server.service.OssService;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * oss上传管理Service实现类
 *
 * @author 彭林生 xpsh696@163.com
 * @version 1.0
 * @date 2021/2/23 15:58
 */
@Service
public class OssServiceImpl implements OssService {

    private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class);
    @Value("${aliyun.oss.policy.expire}")
    private int ALIYUN_OSS_EXPIRE;
    @Value("${aliyun.oss.maxSize}")
    private int ALIYUN_OSS_MAX_SIZE;
    @Value("${aliyun.oss.callback}")
    private String ALIYUN_OSS_CALLBACK;
    @Value("${aliyun.oss.bucketName}")
    private String ALIYUN_OSS_BUCKET_NAME;
    @Value("${aliyun.oss.endpoint}")
    private String ALIYUN_OSS_ENDPOINT;
    @Value("${aliyun.oss.dir.prefix}")
    private String ALIYUN_OSS_DIR_PREFIX;
    @Value("${aliyun.oss.endpointInside}")
    private String ALIYUN_OSS_ENDPOINT_INSIDE;

    @Autowired
    private OSSClient ossClient;

    /**
     * 签名生成
     */
    @Override
    public OssPolicyResult policy() {
        OssPolicyResult result = new OssPolicyResult();
        // 存储目录
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String dir = ALIYUN_OSS_DIR_PREFIX + sdf.format(new Date());
        // 签名有效期
        long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;
        Date expiration = new Date(expireEndTime);
        // 文件大小
        long maxSize = ALIYUN_OSS_MAX_SIZE * 1024 * 1024;
        // 回调
        OssCallbackParam callback = new OssCallbackParam();
        callback.setCallbackUrl(ALIYUN_OSS_CALLBACK);
        callback.setCallbackBody("filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
        callback.setCallbackBodyType("application/x-www-form-urlencoded");
        // 提交节点
        String action = "https://" + ALIYUN_OSS_BUCKET_NAME + "." + ALIYUN_OSS_ENDPOINT;
        try {
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String policy = BinaryUtil.toBase64String(binaryData);
            String signature = ossClient.calculatePostSignature(postPolicy);
            String callbackData = BinaryUtil.toBase64String(JSONUtil.parse(callback).toString().getBytes("utf-8"));
            // 返回结果
            result.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId());
            result.setPolicy(policy);
            result.setSignature(signature);
            result.setDir(dir);
            result.setCallback(callbackData);
            result.setHost(action);
            result.setRandomFileName(UUID.randomUUID().toString());
        } catch (Exception e) {
            LOGGER.error("签名生成失败", e);
        }
        return result;
    }

    @Override
    public OssCallbackResult callback(HttpServletRequest request) {
        OssCallbackResult result = new OssCallbackResult();
        String filename = request.getParameter("filename");
        filename = "http://".concat(ALIYUN_OSS_BUCKET_NAME).concat(".").concat(ALIYUN_OSS_ENDPOINT).concat("/").concat(filename);
        result.setFilename(filename);
        result.setSize(request.getParameter("size"));
        result.setMimeType(request.getParameter("mimeType"));
        result.setWidth(request.getParameter("width"));
        result.setHeight(request.getParameter("height"));
        return result;
    }

    @Override
    public String changeInsidePath(String path) {
        if (StrUtil.isBlank(path)) {
            return null;
        }
        return path.replaceAll(ALIYUN_OSS_ENDPOINT, ALIYUN_OSS_ENDPOINT_INSIDE);
    }
}

4、OssCallbackParam

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * oss上传成功后的回调参数
 * @author 彭林生 xpsh696@163.com
 * @version 1.0
 * @date 2021/2/23 15:56
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class OssCallbackParam {
    //请求的回调地址
    private String callbackUrl;
    //回调是传入request中的参数
    private String callbackBody;
    //回调时传入参数的格式,比如表单提交形式
    private String callbackBodyType;
}

5、OssCallbackResult

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * oss上传文件的回调结果
 * @author 彭林生 xpsh696@163.com
 * @version 1.0
 * @date 2021/2/23 15:55
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class OssCallbackResult {
    //文件名称
    private String filename;
    //文件大小
    private String size;
    //文件的mimeType
    private String mimeType;
    //图片文件的宽
    private String width;
    //图片文件的高
    private String height;
}

6、OssPolicyResult

import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 获取OSS上传文件授权返回结果
 *
 * @author 彭林生 xpsh696@163.com
 * @version 1.0
 * @date 2021/2/23 15:56
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class OssPolicyResult {
    //访问身份验证中用到用户标识
    private String accessKeyId;
    //用户表单上传的策略,经过base64编码过的字符串
    private String policy;
    //对policy签名后的字符串
    private String signature;
    //上传文件夹路径前缀
    private String dir;
    //oss对外服务的访问域名
    private String host;
    //上传成功后的回调设置
    private String callback;
    //随机文件名
    private String randomFileName;
}

7、application.yml

aliyun:
  oss:
    endpoint: oss-cn-hangzhou.aliyuncs.com # oss对外服务的访问域名
    endpointInside: oss-cn-hangzhou-internal.aliyuncs.com    # oss内网访问域名
    accessKeyId: *********** # 访问身份验证中用到用户标识
    accessKeySecret: *********** # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
    bucketName: colacodeapplet # oss的存储空间
    policy:
      expire: 300 # 签名有效期(S)
    maxSize: 10 # 上传文件大小(M)
    callback: http://localhost:8080/crm/aliyun/oss/callback # 文件上传成功后的回调地址
    dir:
      prefix: mall/file/ # 上传文件夹路径前缀

8、pom.xml

<dependency>
	<groupId>com.aliyun.oss</groupId>
	<artifactId>aliyun-sdk-oss</artifactId>
	<version>3.10.2</version>
</dependency>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值