java oss存储对象 文件(视频)上传, 获取回调中的url, 官网地址

目录

1.阿里云官方demo

2.这个是OssUtil(本地可以直接测通)

3.oss回调异常总结

4. 优化版本(不可直接使用)

注意:  想直接使用 请使用 2 中代码 

-> 4.1 修复图片 在网页上只能下载不能预览问题

-> 4.2 修改动态配置, 跟随dev test master 环境获取配置

-> 4.3 上代码

 -> 4.4 另外一种思路 


1.阿里云官方demo

官网地址: ->上传回调 - SDK示例| 阿里云

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.io.ByteArrayInputStream;

public class Demo {
    public static void main(String[] args) {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
        String accessKeyId = "yourAccessKeyId";
        String accessKeySecret = "yourAccessKeySecret";
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
        String objectName = "exampledir/exampleobject.txt";
        // 您的回调服务器地址,例如https://example.com:23450或者https://127.0.0.1:9090。
        String callbackUrl = "yourCallbackServerUrl";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            String content = "Hello OSS";
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName,new ByteArrayInputStream(content.getBytes()));

            // 上传回调参数。
            Callback callback = new Callback();
            callback.setCallbackUrl(callbackUrl);
            //(可选)设置回调请求消息头中Host的值,即您的服务器配置Host的值。
            // callback.setCallbackHost("yourCallbackHost");
            // 设置发起回调时请求body的值。
            callback.setCallbackBody("{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}");
            // 设置发起回调请求的Content-Type。
            callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
            // 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始。
            callback.addCallbackVar("x:var1", "value1");
            callback.addCallbackVar("x:var2", "value2");
            putObjectRequest.setCallback(callback);

            PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);

            // 读取上传回调返回的消息内容。
            byte[] buffer = new byte[1024];
            putObjectResult.getResponse().getContent().read(buffer);
            // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
            putObjectResult.getResponse().getContent().close();
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (Throwable ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

 [官网上有的位置没说 只能自己写]


2.这个是OssUtil(本地可以直接测通)

完整代码跳转: -> oss存储调用,从上传到回调(完整版) 

里面的内容填自己的变量与官网上一致

之后想封装就封装, demo能跑通在封装

看下面的注意事项------------> 

package sso.service.upload.impl;


import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.slf4j.Slf4j;
import sso.util.FileIOUtils;
import sso.vo.SystemResult;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import static sso.vo.ErrorCode.OSS_UPLOAD_CODE;

/**
 * @Author pzy
 * @Version 0.1.0
 */
@Slf4j
public class OSSUtils {

    // public static String UPLOAD_OSS_URL="*";

    /**
     * uploadOssUrl 上传文件的本地路径(寻找)
     * objectName : 上传oss的文件名
     *
     * @param uploadOssUrl
     */
    public static SystemResult OSSUpload(String uploadName, String uploadOssUrl) {

        //获取年月日 +时分秒 文章中记录 如果再使用封装
        String[] strNow1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");

        int i = Integer.parseInt(strNow1[0]);//获取年
        int i1 = Integer.parseInt(strNow1[1]);//获取月
        int i2 = Integer.parseInt(strNow1[2]);//获取日

        //System.out.printf("%s\\%s\\%s\n", i, i1, i2);


        //公司的oss
        String endpoint = "*";
        String accessKeyId = "";
        String accessKeySecret = "";

        String bucketName = "";
        //  img/2022/3/8/AD/
        String objectName = "img" + "/" + i + "/" + i1 + "/" + i2 + "/AD" + "/" + uploadName;

        // 创建OSSClient实例。
        com.aliyun.oss.OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String realUrl = uploadOssUrl + "\\" + uploadName;
        // 上传文件流。
        InputStream inputStream = null;
        try {
            //inputStream = new FileInputStream("D:\\software\\workspaceAll\\test\\testdemo\\src\\main\\resources\\static\\pzy\\01.mp4");
            inputStream = new FileInputStream(realUrl);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);

        // 上传回调参数。
        Callback callback = new Callback();
        //回调路径
        callback.setCallbackUrl("******");

        // 设置发起回调时请求body的值。
        callback.setCallbackBody("bucket:${bucket}&object=${object}");
        // 设置发起回调请求的Content-Type。
        callback.setCalbackBodyType(Callback.CalbackBodyType.URL);
        putObjectRequest.setCallback(callback);
        PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
        // 读取上传回调返回的消息内容。
//        byte[] buffer = new byte[1024];
//        putObjectResult.getResponse().getContent().read(buffer);
//        // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
//        putObjectResult.getResponse().getContent().close();
        //成功后会返回图片的url
        String ossUploadBackUrl = putObjectResult.getResponse().getUri();
//        System.out.println(ossUploadBackUrl);
        log.info("=====>{}", ossUploadBackUrl);



        boolean flag = false;
        //将路径存储数据库
        if (ossUploadBackUrl != null) {
            log.debug("oss存储成功!!!");
            // 关闭OSSClient。
            ossClient.shutdown();

            flag = FileIOUtils.fileGCDelete(realUrl);

            return SystemResult.ok("oss存储成功!!!,本地文件删除状态---->" + flag).putData(ossUploadBackUrl);
        } else {
            log.error("oss存储失败!!!");
            // 关闭OSSClient。
            ossClient.shutdown();

            flag = FileIOUtils.fileGCDelete(realUrl);

            return SystemResult.error(OSS_UPLOAD_CODE, "文件上传Oss失败,本地文件删除状态---->" + flag);
        }


    }
}

注意: 报红的部分 常量或util包直接删除即可(那些是为其他业务服务或者error状态码)

3.oss回调异常总结

回调出现错误可以看看: https://blog.csdn.net/pingzhuyan/article/details/124213798

4. 优化版本(不可直接使用)

注意:  想直接使用 请使用 2 中代码 

注意:  想直接使用 请使用 2 中代码 
-> 4.1 修复图片 在网页上只能下载不能预览问题

-> 4.2 修改动态配置, 跟随dev test master 环境获取配置

ps: 部分位置飘红, 请忽略 仅仅是路径名, 随意添加, 其他不多介绍

-> 4.3 上代码

package com.aisce.axmall.third.utils;


import com.aisce.axmall.third.vo.ResultResponse;
import com.aisce.common.constant.AuthServerConstant;
import com.aisce.common.vo.MemberResponseVo;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import lombok.extern.apachecommons.CommonsLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * oss上传工具包
 * 

* oss V3.0.0版本 启动 * 历史版本: * 1. 搭建oss * 2. 根据代码环境切换回调函数 * 3. 优化服务器内存使用问题 * 4. 修复部分bug *

* 新版划分 * 一级: * 本地dev * 测试test * 正式master *

* * @author pzy */ @Slf4j @Component public class OSSUtils { //accessKey @Value("${spring.cloud.alicloud.access-key}") public String accessKeyIdConst; //秘钥 @Value("${spring.cloud.alicloud.secret-key}") public String accessKeySecretConst; //endPoint @Value("${spring.cloud.alicloud.oss.endpoint}") public String endpointConst; //bucket名 @Value("${spring.cloud.alicloud.oss.bucket}") public String bucketNameConst; //回调函数路径 @Value("${spring.alibaba.oss.callBack.ipUrl}") public String ossCallBackIpUrlConst; /*V3.0版本 优化 新加 跟随环境位置生成不同的文件夹*/ @Value("${spring.profiles.active}") public String environment; /** * 与上面变量一一对应 */ public static String accessKeyId; public static String accessKeySecret; public static String endpoint; public static String bucketName; public static String ossCallBackIpUrl; public static String ossEnvironment; @PostConstruct//初始化 public void init() { /* 赋值操作 */ accessKeyId = accessKeyIdConst; accessKeySecret = accessKeySecretConst; endpoint = endpointConst; bucketName = bucketNameConst; ossCallBackIpUrl = ossCallBackIpUrlConst; ossEnvironment = environment; } // public static String UPLOAD_OSS_URL="*"; /** * uploadOssUrl 上传文件的本地路径(寻找) * objectName : 上传oss的文件名 * * @param uploadOssUrl */ public static ResultResponse OSSUpload(String uploadName, String uploadOssUrl) { //V3.0.1版 废弃-----------------------------------------------> //获取年月日 +时分秒 文章中记录 如果再使用封装 // String[] strNow1 = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-"); // int i = Integer.parseInt(strNow1[0]);//获取年 // int i1 = Integer.parseInt(strNow1[1]);//获取月 // int i2 = Integer.parseInt(strNow1[2]);//获取日 //System.out.printf("%s\\%s\\%s\n", i, i1, i2); // img/2022/3/8/AD/ oss上传路径整合修改 // String objectName = "img" + "/" + i + "/" + i1 + "/" + i2 + "/pzyStorekeeperOSS" + "/" + uploadName; // String objectName = ossEnvironment + "/" + i + "/" + i1 + "/" + i2 + "/pzyStorekeeperOSS" + "/" + uploadName; //-----------------------------------------------------------> Integer companyId = *;//随便 Integer userRole = *;//随便 String roleName = roleChangeToName(userRole); /** * V3.0.1版: * 路径优化: * 演示示例一: dev/store/2023/01/***.png * 演示示例二: */ String objectName = String.format("%s/%s/%s/%s", ossEnvironment, roleName, companyId, uploadName); // 创建OSSClient实例 开启oss。 com.aliyun.oss.OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); String realUrl = uploadOssUrl + "\\" + uploadName; // 上传文件流。 InputStream inputStream = null; try { inputStream = new FileInputStream(realUrl); } catch (FileNotFoundException e) { e.printStackTrace(); throw new RuntimeException("路径异常,上传失败"); } /*V3.0.1 解决阿里云OSS 打开图片地址无法预览,直接下载*/ ObjectMetadata meta = new ObjectMetadata(); meta.setContentType("image/jpg");//指定了图片格式 PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream, meta); // 上传回调参数。 Callback callback = new Callback(); //回调路径 callback.setCallbackUrl(ossCallBackIpUrl); // 设置发起回调时请求body的值。 callback.setCallbackBody("bucket:${bucket}&object=${object}"); // 设置发起回调请求的Content-Type。 callback.setCalbackBodyType(Callback.CalbackBodyType.URL); putObjectRequest.setCallback(callback); PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest); // 读取上传回调返回的消息内容。 // byte[] buffer = new byte[1024]; // putObjectResult.getResponse().getContent().read(buffer); // // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。 // putObjectResult.getResponse().getContent().close(); //成功后会返回图片的url String ossUploadBackUrl = putObjectResult.getResponse().getUri(); // System.out.println(ossUploadBackUrl); log.info("=====>{}", ossUploadBackUrl); boolean flag = false; //将路径存储数据库 if (ossUploadBackUrl != null) { log.debug("oss存储成功!!!"); // 关闭OSSClient。 ossClient.shutdown(); flag = FileIOUtils.fileGCDelete(realUrl); log.info("返回信息:{}", flag); return ResultResponse.ok(ossUploadBackUrl); } else { log.error("oss存储失败!!!"); // 关闭OSSClient。 ossClient.shutdown(); flag = FileIOUtils.fileGCDelete(realUrl); return ResultResponse.error("文件上传Oss失败,本地文件删除状态---->" + flag); } } /** * 角色转化方法 * * @param userRole * @return */ private static String roleChangeToName(Integer userRole) { String roleName = ""; switch (userRole) { case 1://* roleName = "*"; break; case 2://* roleName = "*"; break; case 3://* roleName = "*"; break; case 4://* roleName = "*"; break; default://* roleName = "*"; break; } return roleName; } }

-> 4.4 yml配置(微服务位置可以直接删除)

spring:
  application:
    name: *
  servlet:
    multipart:
      location: /data/upload #解决长时间不使用异常的bug
      #限制视频上传大小20MB
      max-file-size: 20MB
      max-request-size: 20MB
  cloud:
    nacos:
      discovery:
       server-addr: 127.0.0.1:8848
    alicloud:
      access-key: *
      secret-key: *
      oss:
        endpoint: *
        bucket: *

 -> 4.5 另外一种思路 

创建@Bean对象 但是容易出现创建失败 显示ossClient关闭现象

你可能感兴趣的:(#,第三方服务,java,oss,OssUtil,callback,exception)