本文主要介绍专业版应用支持的存储访问方式和这些访问方式的使用方法。
说明:
访问方式
专业版应用支持的存储访问方式如下:
类型 | 访问方式 | 访问域名 | 作用 |
预置域名 | 存储桶公网域名 | [BucketId].vodpro.[存储地域].eovod.com | 用于公网对媒体文件进行增删改查。 |
| 存储桶内网域名 | [BucketId].vodsrc-internal.[存储地域].eovod.com | 用于在腾讯云内网同地域对媒体文件进行增删查改,支持下载且不产生流量费用。 |
自定义域名 | EdgeOne 加速分发域名 | 客户自定义 | 用于媒体文件的分发播放。 |
使用方法
存储桶公网域名
准备工作
1. 创建应用和存储桶。
2. 获取密钥对。
使用 S3 SDK 访问存储桶
下面介绍在常用的编程语言中,如何进行适配以访问专业版应用的存储桶。
假设存储地域为
ap-guangzhou
,存储桶 ID 为 bucketid1
,常用语言初始化 S3 客户端并获取对象元数据的代码实现如下所示:import ("context""errors""fmt""net/url""os""github.com/aws/aws-sdk-go-v2/aws""github.com/aws/aws-sdk-go-v2/credentials""github.com/aws/aws-sdk-go-v2/service/s3"smep "github.com/aws/smithy-go/endpoints""github.com/aws/smithy-go/logging")type customEndpointResolverV2 struct {}// ResolveEndpoint 自定义接入点func (r *customEndpointResolverV2) ResolveEndpoint(ctx context.Context,params s3.EndpointParameters) (smep.Endpoint, error) {if params.Bucket == nil || params.Region == nil {return smep.Endpoint{}, errors.New("invalid endpoint param")}return smep.Endpoint{URI: url.URL{Scheme: "https",Host: fmt.Sprintf("%s.vodpro.%s.eovod.com", *params.Bucket, *params.Region),},}, nil}func main() {// 初始化客户端s3cli := s3.New(s3.Options{Credentials: credentials.NewStaticCredentialsProvider("AccessKeyId", // 填入密钥对中的 AccessKeyId"SecretAccessKey", // 填入密钥对中的 SecretAccessKey""),EndpointResolverV2: new(customEndpointResolverV2), // 自定义访问域名UsePathStyle: false, // 请求禁用 path styleLogger: logging.NewStandardLogger(os.Stdout), // 日志打印到标准输出流ClientLogMode: aws.LogRequest | aws.LogResponse, // 打印请求头和响应头Region: "ap-guangzhou", // 存储地域})// 获取媒体文件的元数据_, _ = s3cli.HeadObject(context.TODO(), &s3.HeadObjectInput{Bucket: aws.String("bucketid1"), // Bucket 设置为点播专业版应用中的存储桶 IDKey: aws.String("a/b/c.jpeg"), // 媒体文件在存储桶中的路径})}
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.HeadObjectRequest;import software.amazon.awssdk.services.s3.model.HeadObjectResponse;import java.net.URI;public class Main {// 自定义端点解析器public static void main(String[] args) {// 初始化 S3 客户端S3Client s3Client = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("AccessKeyId", // 填入密钥对中的 AccessKeyId"SecretAccessKey" // 填入密钥对中的 SecretAccessKey))).endpointOverride(URI.create("https://vodpro.ap-guangzhou.eovod.com")).region(Region.of("ap-guangzhou")).build();// 获取媒体文件的元数据try {HeadObjectRequest headObjectRequest = HeadObjectRequest.builder().bucket("bucketid1") // Bucket 设置为点播专业版应用中的存储桶 ID.key("a/b/c.jpeg") // 媒体文件在存储桶中的路径.build();HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest);System.out.println("Content Length: " + headObjectResponse.contentLength());} catch (Exception e) {e.printStackTrace();} finally {s3Client.close();}}}
#include <aws/core/Aws.h>#include <aws/core/auth/AWSCredentials.h>#include <aws/s3/S3Client.h>#include <aws/s3/model/HeadObjectRequest.h>#include <iostream>#include <string>int main() {// 初始化 AWS SDKconst Aws::SDKOptions options;InitAPI(options);// 自定义访问域名Aws::Client::ClientConfiguration clientConfig;clientConfig.scheme = Aws::Http::Scheme::HTTPS;clientConfig.endpointOverride = "vodpro.ap-guangzhou.eovod.com";// 创建 S3 客户端const Aws::S3::S3Client s3Client(Aws::Auth::AWSCredentials("AccessKeyId", // 填入密钥对中的 AccessKeyId"SecretAccessKey" // 填入密钥对中的 SecretAccessKey),nullptr, clientConfig);// 创建 HeadObject 请求Aws::S3::Model::HeadObjectRequest request;request.SetBucket("bucketid1"); // Bucket 设置为点播专业版应用中的存储桶 IDrequest.SetKey("a/b/c.jpeg"); // 媒体文件在存储桶中的路径// 发送请求auto outcome = s3Client.HeadObject(request);if (outcome.IsSuccess()) {std::cout << "Head object succeeded!" << std::endl;const auto &object = outcome.GetResult();std::cout << "Content Length: " << object.GetContentLength() << std::endl;} else {const auto error = outcome.GetError();std::cout << "Error: " << error.GetMessage() << std::endl;}// 清理 AWS SDKAws::ShutdownAPI(options);return 0;}
import boto3from botocore.config import Configfrom botocore.exceptions import ClientError# 创建 S3 客户端s3_client = boto3.client('s3',aws_access_key_id='AccessKeyId', # 填入密钥对中的 AccessKeyIdaws_secret_access_key='SecretAccessKey', # 填入密钥对中的 SecretAccessKeyendpoint_url='https://vodpro.ap-guangzhou.eovod.com', # 自定义访问域名config=Config(s3={'addressing_style': 'virtual'}), # 使用 virtual hosted-style)try:# 获取媒体文件的元数据response = s3_client.head_object(Bucket="bucketid1", # Bucket 设置为点播专业版应用中的存储桶 IDKey="a/b/c.jpeg" # 媒体文件在存储桶中的路径)print(response)except ClientError as e:print(f"Error: {e}")
存储桶内网域名
注意:
存储桶内网域名有一定的生效时间,一般在存储桶创建后 30 ~ 120 分钟生效。
内网域名必须在与存储桶相同地域的腾讯云服务器上才能访问,否则会得到 404 响应码。可以尝试在服务器上使用
nslookups
等指令进行域名解析,若得到形如 10.*.*.*
、100.*.*.*
或169.254.*.*
等形式的 IP,则一般可以进行内网访问。准备工作
1. 创建应用和存储桶。
2. 获取密钥对。
3. 准备服务器。
使用 S3 SDK 访问存储桶
下面介绍在常用的编程语言中,如何进行适配以通过内网访问专业版应用的存储桶。
假设存储地域为
ap-guangzhou
,存储桶 ID 为bucketid1
,常用语言初始化 S3 客户端并获取对象元数据的代码实现如下所示:import ("context""errors""fmt""net/url""os""github.com/aws/aws-sdk-go-v2/aws""github.com/aws/aws-sdk-go-v2/credentials""github.com/aws/aws-sdk-go-v2/service/s3"smep "github.com/aws/smithy-go/endpoints""github.com/aws/smithy-go/logging")type customEndpointResolverV2 struct {}// ResolveEndpoint 自定义接入点func (r *customEndpointResolverV2) ResolveEndpoint(ctx context.Context,params s3.EndpointParameters) (smep.Endpoint, error) {if params.Bucket == nil || params.Region == nil {return smep.Endpoint{}, errors.New("invalid endpoint param")}return smep.Endpoint{URI: url.URL{Scheme: "https",Host: fmt.Sprintf("%s.vodsrc-internal.%s.eovod.com", *params.Bucket, *params.Region),},}, nil}func main() {// 初始化客户端s3cli := s3.New(s3.Options{Credentials: credentials.NewStaticCredentialsProvider("AccessKeyId", // 填入密钥对中的 AccessKeyId"SecretAccessKey", // 填入密钥对中的 SecretAccessKey""),EndpointResolverV2: new(customEndpointResolverV2), // 自定义访问域名UsePathStyle: false, // 请求禁用 path styleLogger: logging.NewStandardLogger(os.Stdout), // 日志打印到标准输出流ClientLogMode: aws.LogRequest | aws.LogResponse, // 打印请求头和响应头Region: "ap-guangzhou", // 存储地域})// 获取媒体文件的元数据_, _ = s3cli.HeadObject(context.TODO(), &s3.HeadObjectInput{Bucket: aws.String("bucketid1"), // Bucket 设置为点播专业版应用中的存储桶 IDKey: aws.String("a/b/c.jpeg"), // 媒体文件在存储桶中的路径})}
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;import software.amazon.awssdk.services.s3.S3Client;import software.amazon.awssdk.services.s3.model.HeadObjectRequest;import software.amazon.awssdk.services.s3.model.HeadObjectResponse;import java.net.URI;public class Main {// 自定义端点解析器public static void main(String[] args) {// 初始化 S3 客户端S3Client s3Client = S3Client.builder().credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("AccessKeyId", // 填入密钥对中的 AccessKeyId"SecretAccessKey" // 填入密钥对中的 SecretAccessKey))).endpointOverride(URI.create("https://vodsrc-internal.ap-guangzhou.eovod.com")).region(Region.of("ap-guangzhou")).build();// 获取媒体文件的元数据try {HeadObjectRequest headObjectRequest = HeadObjectRequest.builder().bucket("bucketid1") // Bucket 设置为点播专业版应用中的存储桶 ID.key("a/b/c.jpeg") // 媒体文件在存储桶中的路径.build();HeadObjectResponse headObjectResponse = s3Client.headObject(headObjectRequest);System.out.println("Content Length: " + headObjectResponse.contentLength());} catch (Exception e) {e.printStackTrace();} finally {s3Client.close();}}}
#include <aws/core/Aws.h>#include <aws/core/auth/AWSCredentials.h>#include <aws/s3/S3Client.h>#include <aws/s3/model/HeadObjectRequest.h>#include <iostream>#include <string>int main() {// 初始化 AWS SDKconst Aws::SDKOptions options;InitAPI(options);// 自定义访问域名Aws::Client::ClientConfiguration clientConfig;clientConfig.scheme = Aws::Http::Scheme::HTTPS;clientConfig.endpointOverride = "vodsrc-internal.ap-guangzhou.eovod.com";// 创建 S3 客户端const Aws::S3::S3Client s3Client(Aws::Auth::AWSCredentials("AccessKeyId", // 填入密钥对中的 AccessKeyId"SecretAccessKey" // 填入秘钥对中的 SecretAccessKey),nullptr, clientConfig);// 创建 HeadObject 请求Aws::S3::Model::HeadObjectRequest request;request.SetBucket("bucketid1"); // Bucket 设置为点播专业版应用中的存储桶 IDrequest.SetKey("a/b/c.jpeg"); // 媒体文件在存储桶中的路径// 发送请求auto outcome = s3Client.HeadObject(request);if (outcome.IsSuccess()) {std::cout << "Head object succeeded!" << std::endl;const auto &object = outcome.GetResult();std::cout << "Content Length: " << object.GetContentLength() << std::endl;} else {const auto error = outcome.GetError();std::cout << "Error: " << error.GetMessage() << std::endl;}// 清理 AWS SDKAws::ShutdownAPI(options);return 0;}
import boto3from botocore.config import Configfrom botocore.exceptions import ClientError# 创建 S3 客户端s3_client = boto3.client('s3',aws_access_key_id='AccessKeyId', # 填入密钥对中的 AccessKeyIdaws_secret_access_key='SecretAccessKey', # 填入秘钥对中的 SecretAccessKeyendpoint_url='https://vodsrc-internal.ap-guangzhou.eovod.com', # 自定义访问域名config=Config(s3={'addressing_style': 'virtual'}), # 使用 virtual hosted-style)try:# 获取媒体文件的元数据response = s3_client.head_object(Bucket="bucketid1", # Bucket 设置为点播专业版应用中的存储桶 IDKey="a/b/c.jpeg" # 媒体文件在存储桶中的路径)print(response)except ClientError as e:print(f"Error: {e}")
EdgeOne 加速域名
专业版应用支持使用腾讯云 EdgeOne 进行媒体内容的加速分发。客户可以在 EdgeOne 中将域名源站配置为云点播专业版应用,即可使用自定义域名通过 EdgeOne 强大的安全加速网络,迅捷地下载或者播放媒体文件。