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

  • Post author:
  • Post category:java



目录


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上传工具包
 * <p>
 * oss V3.0.0版本 启动
 * 历史版本:
 * 1. 搭建oss
 * 2. 根据代码环境切换回调函数
 * 3. 优化服务器内存使用问题
 * 4. 修复部分bug
 * <p>
 * 新版划分
 * 一级:
 * 本地dev
 * 测试test
 * 正式master
 * <p>
 *
 * @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关闭现象



版权声明:本文为pingzhuyan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。