上傳SDK基於OSS SDK封裝了部分上傳邏輯,簡化使用者整合操作。如果上傳SDK無法滿足業務需求或希望更加靈活地控制上傳,您也可直接使用OSS SDK上傳檔案。
OSS SDK
OSS SDK支援Java、Python、Go、PHP、Node.js、Ruby等程式設計語言,支援iOS、Android、Harmony等用戶端,更多資訊請參考使用SDK發起請求概述。
流程介紹
服務端上傳情境
如果您在商務服務器上使用OSS SDK(Java、Python、PHP等程式設計語言)上傳本地檔案到OSS Bucket,能夠確保AK的安全使用,則可以直接在商務服務器調用點播OpenAPI,擷取上傳地址和憑證,再調用OSS SDK上傳檔案。
用戶端上傳情境
如果您在用戶端(網頁、iOS應用、Android應用)上使用OSS SDK上傳本地檔案到OSS Bucket,需要在您的商務服務器提前搭建授權服務,用戶端調用授權服務擷取上傳地址和憑證,再從用戶端直接向OSS上傳檔案。
說明:
應用伺服器向點播服務擷取上傳地址和憑證的操作步驟和範例程式碼,參考擷取上傳地址和憑證。
返回Base64加密的上傳地址(UploadAddress)、上傳憑證(UploadAuth)、媒體ID等資訊,你需要手動解析參數,將其轉為OSS SDK初始化的入參。
說明UploadAddress欄位包含上傳的OSS Bucket相關資訊,UploadAuth欄位包含STS Token等授權資訊,請手動使用Base64解碼上傳地址和憑證,並使用對應欄位初始化OSS SDK用戶端,參考資訊:解析上傳地址和憑證說明。點播服務在下發上傳地址和憑證時還會自動建立媒資資訊,即媒體ID(MediaId),請妥善儲存媒體ID,作為媒資管理、音視頻播放、ApsaraVideo for Media Processing等的輸入。
擷取視頻上傳地址和憑證返回的
VideoId。擷取圖片上傳地址和憑證返回的
ImageId。擷取輔助媒資上傳地址和憑證返回的
MediaId。
樣本Demo下載
ApsaraVideo for VOD提供了Demo源碼供開發人員參考。
程式整合
接下來我們以Java程式設計語言為例,介紹詳細的整合步驟。
前提條件
您已經開通了ApsaraVideo for VOD服務。開通步驟請參見開通ApsaraVideo for VOD服務。
您已經完成上傳相關的系統配置,包括啟用目標儲存地區的儲存地址和配置回調。操作指引請參見管理儲存Bucket及回調設定。
您已準備好用於調用點播服務的帳號。為避免阿里雲帳號AccessKey泄露帶來的安全風險,推薦您建立RAM使用者並授予其VOD相關許可權。然後使用RAM使用者的AK對(AccessKey ID和AccessKey Secret)訪問點播服務。操作指引請參見建立RAM使用者並授權。
已配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具體操作,請參見在Linux、macOS和Windows系統配置環境變數。
重要阿里雲帳號的AccessKey擁有所有API的存取權限,建議您使用RAM使用者的AccessKey進行API訪問或日常營運。
強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
(可選)如需使用STS臨時授權方式(阿里雲Security Token Service)訪問點播服務,請為RAM使用者建立角色並授予角色VOD相關許可權。操作指引請參見擷取STS Token。
環境要求
環境要求使用Java 1.8及以上版本。
可在終端執行
java -version命令查看Java版本。
範例程式碼
V1.0 SDK
步驟一、安裝依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.16.32</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>步驟二、上傳(Java程式碼範例)
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSSClient;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoRequest;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse;
import org.apache.commons.codec.binary.Base64;
import java.io.File;
/**
* descript
*/
public class UploadDemo {
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// 根據點播接入服務所在的Region填寫,例如:接入服務在上海,則填cn-shanghai;其他地區請參見媒體上傳概述。
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
public static CreateUploadVideoResponse createUploadVideo(DefaultAcsClient vodClient) throws ClientException {
CreateUploadVideoRequest request = new CreateUploadVideoRequest();
request.setFileName("vod_test.mp4");
request.setTitle("this is title");
//request.setDescription("this is desc");
//request.setTags("tag1,tag2");
//CoverURL樣本:http://example.aliyundoc.com/test_cover_****.jpg
//request.setCoverURL("<your CoverURL>");
//request.setCateId(-1L);
//request.setTemplateGroupId("");
//request.setWorkflowId("");
//request.setStorageLocation("");
//request.setAppId("app-1000000");
//佈建要求逾時時間
request.setSysReadTimeout(1000);
request.setSysConnectTimeout(1000);
return vodClient.getAcsResponse(request);
}
public static OSSClient initOssClient(JSONObject uploadAuth, JSONObject uploadAddress) {
String endpoint = uploadAddress.getString("Endpoint");
String accessKeyId = uploadAuth.getString("AccessKeyId");
String accessKeySecret = uploadAuth.getString("AccessKeySecret");
String securityToken = uploadAuth.getString("SecurityToken");
return new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
}
public static void uploadLocalFile(OSSClient ossClient, JSONObject uploadAddress, String localFile) {
String bucketName = uploadAddress.getString("Bucket");
String objectName = uploadAddress.getString("FileName");
File file = new File(localFile);
ossClient.putObject(bucketName, objectName, file);
}
public static void main(String[] argv) {
// 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
// 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
// 本樣本通過從環境變數中讀取AccessKey,來實現API訪問的身分識別驗證。運行程式碼範例前,請配置環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
//您的AccessKeyId
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
//您的AccessKeySecret
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
//需要上傳到VOD的本地視頻檔案的完整路徑,需要包含副檔名
String localFile = "/Users/yours/Video/testVideo.flv";
try {
// 初始化VOD用戶端並擷取上傳地址和憑證
DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret);
CreateUploadVideoResponse createUploadVideoResponse = createUploadVideo(vodClient);
// 執行成功會返回VideoId、UploadAddress和UploadAuth
String videoId = createUploadVideoResponse.getVideoId();
JSONObject uploadAuth = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAuth()));
JSONObject uploadAddress = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAddress()));
// 使用UploadAuth和UploadAddress初始化OSS用戶端
OSSClient ossClient = initOssClient(uploadAuth, uploadAddress);
// 上傳檔案,注意是同步上傳會阻塞等待,耗時與檔案大小和網路上行頻寬有關
uploadLocalFile(ossClient, uploadAddress, localFile);
System.out.println("Put local file succeed, VideoId : " + videoId);
} catch (Exception e) {
System.out.println("Put local file fail, ErrorMessage : " + e.getLocalizedMessage());
}
}
private static String decodeBase64(String data) {
return new String(Base64.decodeBase64(data));
}
}
V2.0 SDK
步驟一、安裝依賴
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>3.6.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.8</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-console</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-util</artifactId>
<version>0.2.23</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>credentials-java</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>步驟二、上傳(Java程式碼範例)
工程代碼建議使用更安全的無AK方式,憑據配置方式請參見管理訪問憑據。
package com.aliyun.sample;
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectResult;
import com.aliyun.tea.*;
import com.alibaba.fastjson.JSONObject;
import java.io.File;
import org.apache.commons.codec.binary.Base64;
public class Sample {
/**
* <b>description</b> :
* <p>使用憑據初始化帳號Client</p>
* @return Client
*
* @throws Exception
*/
public static com.aliyun.vod20170321.Client createClient() throws Exception {
com.aliyun.credentials.models.Config creditConfig = new com.aliyun.credentials.models.Config();
creditConfig.setType("access_key")
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client(creditConfig);
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
.setCredential(credential);
// Endpoint 請參考 https://api.aliyun.com/product/vod
config.endpoint = "vod.cn-shanghai.aliyuncs.com";
return new com.aliyun.vod20170321.Client(config);
}
public static void main(String[] args_) throws Exception {
com.aliyun.vod20170321.Client client = Sample.createClient();
com.aliyun.vod20170321.models.CreateUploadVideoRequest createUploadVideoRequest = new com.aliyun.vod20170321.models.CreateUploadVideoRequest()
.setFileName("ecs.mp4")
.setTitle("ecs");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
com.aliyun.vod20170321.models.CreateUploadVideoResponse resp = client.createUploadVideoWithOptions(createUploadVideoRequest, runtime);
// 執行成功會返回VideoId、UploadAddress和UploadAuth
String videoId = resp.getBody().videoId;
String localFile = "/Users/yours/ecs.mp4";
JSONObject uploadAuth = JSONObject.parseObject(decodeBase64(resp.getBody().uploadAuth));
JSONObject uploadAddress = JSONObject.parseObject(decodeBase64(resp.getBody().uploadAddress));
OSS ossClient = initOssClient(uploadAuth, uploadAddress);
uploadLocalFile(ossClient, uploadAddress, localFile);
System.out.println("Put local file succeed, VideoId : " + videoId);
} catch (TeaException error) {
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
/**
* 初始化OSS Client
* @param uploadAuth
* @param uploadAddress
* @return
*/
public static OSS initOssClient(JSONObject uploadAuth, JSONObject uploadAddress) {
String endpoint = uploadAddress.getString("Endpoint");
String accessKeyId = uploadAuth.getString("AccessKeyId");
String accessKeySecret = uploadAuth.getString("AccessKeySecret");
String securityToken = uploadAuth.getString("SecurityToken");
com.aliyun.credentials.models.Config creditConfig = new com.aliyun.credentials.models.Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret)
.setSecurityToken(securityToken);
DefaultCredentialProvider credentialsProvider = new CredentialsProviderFactory()
.newDefaultCredentialProvider(accessKeyId, accessKeySecret, securityToken);
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V1);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(endpoint)
.build();
return ossClient;
}
/**
* 上傳本地檔案
* @param ossClient
* @param uploadAddress
* @param localFile
* @throws Exception
*/
public static void uploadLocalFile(OSS ossClient, JSONObject uploadAddress, String localFile) throws Exception {
String bucketName = uploadAddress.getString("Bucket");
String objectName = uploadAddress.getString("FileName");
File file = new File(localFile);
PutObjectResult result = ossClient.putObject(bucketName, objectName, file);
com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(result));
}
/**
* 解碼UploadAuth/UploadAddress
* @param s
* @return
*/
public static String decodeBase64(String s) {
byte[] b = null;
String result = null;
if (s != null) {
Base64 decoder = new Base64();
try {
b = decoder.decode(s);
result = new String(b, "utf-8");
} catch (Exception e) {
}
}
return result;
}
}
參考資訊:解析上傳地址和憑證說明
Base64解析上傳地址(UploadAddress)和上傳憑證(UploadAuth),得到OSS的上傳地址和授權資訊。解析後的上傳地址和授權資訊可用於初始化OSS用戶端。範例程式碼如下:
import org.apache.commons.codec.binary.Base64;
public static String decodeBase64(String s) {
byte[] b = null;
String result = null;
if (s != null) {
Base64 decoder = new Base64();
try {
b = decoder.decode(s);
result = new String(b, "utf-8");
} catch (Exception e) {
}
}
return result;
}表 1. UploadAddress解析後欄位
欄位 | 描述 |
Bucket | 點播儲存地址。 |
Endpoint | 點播儲存地區標識。 |
FileName | 點播系統為上傳檔案分配的檔案名稱。 |
ObjectPrefix | 若且唯若上傳檔案是M3U8檔案時返回。 |
表 2. UploadAuth解析後欄位
欄位 | 描述 |
AccessKeyId | 上傳使用者的AccessKey ID。 |
AccessKeySecret | 上傳使用者的AccessKey Secret。 |
SecurityToken | 上傳授權安全性權杖。 |
ExpireUTCTime | 上傳地址和憑證到期時間,為UTC時間,格式:yyyy-MM-ddTHH:mm:ssZ。 |
Expiration | 上傳授權到期時間,視頻為3000秒,到期需要重新整理上傳憑證。 |
Region | 上傳地區標識。 |