對象存儲OSS存儲的文件(Object)信息包含Key、Data和Object Meta。Object Meta是對文件的屬性描述,包括HTTP標準屬性(HTTP Header)和用戶自定義元數據(User Meta)兩種。您可以通過設置HTTP標準屬性來自定義HTTP請求的策略,例如文件(Object)緩存策略、強制下載策略等。您還可以通過設置用戶自定義元數據來標識Object的用途或屬性等。
HTTP標準屬性
OSS將為上傳至Bucket中的每個Object保留如下HTTP標準屬性。
名稱 | 描述 |
Content-Type | 指定Object的文件類型。內容類型決定瀏覽器將以什么形式、什么編碼讀取文件。如果沒有指定文件類型,則根據文件的擴展名生成。如果文件沒有擴展名,則文件類型的默認值 |
Content-Encoding | 聲明Object的編碼方式。您需要按照Object 的實際編碼類型填寫,否則可能造成客戶端(瀏覽器)解析編碼失敗或Object下載失敗。若Object未編碼,請置空此項。取值如下:
關于Content-Encoding的更多信息,請參見RFC2616。 重要 如果您希望訪問OSS內常見網頁靜態文件(HTML、Javascript、XML、json)時進行Gzip壓縮,您需要置空此項,并在請求中增加 |
Content-Language | 聲明Object內容使用的語言。例如某個Object使用簡體中文編寫,則此項可設置為zh-CN。 |
Content-Disposition | 指定Object的展示形式。取值如下:
將Object下載到瀏覽器指定路徑時: 說明
通過文件URL訪問文件時是預覽還是以附件形式下載,與文件所在Bucket的創建時間、OSS開通時間以及使用的域名類型有關。更多信息,請參見通過文件URL訪問文件無法預覽而是以附件形式下載?。 |
Cache-Control | 說明 如果未設置Cache-Control,OSS不會在響應Header中返回該字段,即Cache-Control字段不存在。此時,Object的緩存行為將由瀏覽器自身的緩存策略決定。 指定Object的緩存行為。取值如下:
|
Expires | 緩存內容的絕對過期時間,格式是格林威治時間(GMT)。例如 |
Last-Modified | Object的最后修改時間。Last-Modified由OSS自動更新,用于緩存控制、同步和數據管理,以UTC格式表示,不可手動更改。更多信息,請參見哪些操作會更新Object的LastModified?。 說明 OSS控制臺在展示文件更新時間時,會將其從UTC時間格式轉換為本地時間格式,從而確保您在控制臺上看到的時間與所處時區的本地時間一致。例如,假設文件更新時間為2024年2月28日下午1點31分54秒,如果您所處的時區是北京時區(東八區,UTC+8),控制臺會自動將時間增加8小時,展示為2024年2月28日晚上9點31分54秒。 |
Content-Length | Object的大小,單位為字節。 |
用戶自定義元數據
您可以在上傳Object時,為Object添加自定義元數據(User Meta),用于標識Object的用途或屬性等。
一個Object可以有多個自定義元數據,但所有的自定義元數據總大小不能超過8 KB。
自定義元數據是一組鍵值對,元數據名稱必須以
x-oss-meta-
開頭。例如x-oss-meta-last-modified:20210506
,可用于記錄本地文件最后修改時間為2021年5月6日。調用GetObject或者HeadObject接口時,將在HTTP頭部返回自定義元數據。
操作步驟
使用OSS控制臺
通過OSS管理控制臺一次可批量為100個Object設置文件元數據。
登錄OSS管理控制臺。
單擊Bucket 列表,然后單擊目標Bucket名稱。
在左側導航欄,選擇文件管理>文件列表。
設置HTTP標準屬性以及用戶自定義元數據。
設置多個Object的HTTP頭
選中一個或多個Object,然后單擊下方的設置文件元數據。
設置單個Object的HTTP頭
在目標Object右側選擇
。
單擊確定。
使用圖形化管理工具ossbrowser
ossbrowser支持Object級別的操作與控制臺支持的操作類似,請按照ossbrowser界面指引完成設置Object元數據的操作。關于如何使用ossbrowser,請參見快速使用ossbrowser。
使用阿里云SDK
以下僅列舉常見SDK的設置Object元數據的代碼示例。關于其他SDK的設置Object元數據的代碼示例,請參見SDK簡介。
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.common.utils.DateUtil;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫不包含Bucket名稱在內的Object完整路徑,例如testfolder/exampleobject.txt。
String objectName = "testfolder/exampleobject.txt";
String content = "Hello OSS";
// 填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 創建OSSClient實例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 創建上傳文件的元數據。
ObjectMetadata meta = new ObjectMetadata();
String md5 = BinaryUtil.toBase64String(BinaryUtil.calculateMd5(content.getBytes()));
// 開啟文件內容MD5校驗。開啟后OSS會把您提供的MD5與文件的MD5比較,不一致則拋出異常。
meta.setContentMD5(md5);
// 指定上傳的內容類型。內容類型決定瀏覽器將以什么形式、什么編碼讀取文件。如果沒有指定則根據文件的擴展名生成,如果沒有擴展名則為默認值application/octet-stream。
meta.setContentType("text/plain");
// 設置內容被下載時的名稱。
meta.setContentDisposition("attachment; filename=\"DownloadFilename\"");
// 設置上傳文件的長度。如超過此長度,則上傳文件會被截斷,上傳的文件長度為設置的長度。如小于此長度,則為上傳文件的實際長度。
meta.setContentLength(content.length());
// 設置內容被下載時網頁的緩存行為。
meta.setCacheControl("Download Action");
// 設置緩存過期時間,格式是格林威治時間(GMT)。
meta.setExpirationTime(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z"));
// 設置內容被下載時的編碼格式。
meta.setContentEncoding("gzip");
// 設置Header。
meta.setHeader("yourHeader", "yourHeaderValue");
// 上傳文件。
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content.getBytes()), meta);
} 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 (ClientException 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();
}
}
}
}
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\CoreOssException;
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填寫Bucket名稱,例如examplebucket。
$bucket= "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
$object = "exampledir/exampleobject.txt";
$content = file_get_contents(__FILE__);
$options = array(
OssClient::OSS_HEADERS => array(
'Expires' => '2012-10-01 08:00:00',
'Content-Disposition' => 'attachment; filename="xxxxxx"',
'x-oss-meta-self-define-title' => 'user define meta info',
));
try{
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 上傳文件時設置元數據。
$ossClient->putObject($bucket, $object, $content, $options);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
const OSS = require('ali-oss');
const client = new OSS({
// yourregion填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
region: 'yourRegion',
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
// 填寫Bucket名稱。
bucket: 'examplebucket'
});
async function put() {
try {
let meta = { year: 2016, people: 'mary' };
let result = await client.put('object-name', path.normalize('D:\\localpath\\examplefile.txt'), meta);
console.log(result);
} catch (e) {
console.log(e);
}
}
put();
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# 填寫Endpoint對應的Region信息,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數
region = "cn-hangzhou"
# yourBucketName填寫存儲空間名稱。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
object_name = 'exampledir/exampleobject.txt'
# 填寫待上傳的字符串。
content = '{"age": 1}'
# 設置HTTP header,例如HTTP header的名稱為Content-Type,值為'application/json; charset=utf-8'。
bucket.put_object(object_name, content, headers={'Content-Type': 'application/json; charset=utf-8'})
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Util;
// yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
var endpoint = "yourEndpoint";
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// 填寫Bucket名稱。
var bucketName = "examplebucket";
// 填寫Object完整路徑。Object完整路徑中不能包含Bucket名稱。
var objectName = "exampleobject.txt";
// 填寫本地文件的完整路徑。如果未指定本地路徑,則默認從示例程序所屬項目對應本地路徑中上傳文件。
var localFilename = "D:\\localpath\\examplefile.txt";
// 填寫Bucket所在地域對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。
const string region = "cn-hangzhou";
// 創建ClientConfiguration實例,按照您的需要修改默認參數。
var conf = new ClientConfiguration();
// 設置v4簽名。
conf.SignatureVersion = SignatureVersion.V4;
// 創建OssClient實例。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
c.SetRegion(region);
try
{
using (var fs = File.Open(localFilename, FileMode.Open))
{
// 創建上傳文件的元數據,可以通過文件元數據設置HTTP header。
var metadata = new ObjectMetadata()
{
// 指定文件類型。
ContentType = "text/html",
// 設置緩存過期時間,格式是格林威治時間(GMT)。
ExpirationTime = DateTime.Parse("2025-10-12T00:00:00.000Z"),
};
// 設置上傳文件的長度。如超過此長度,則會被截斷為設置的長度。如不足,則為上傳文件的實際長度。
metadata.ContentLength = fs.Length;
// 設置文件被下載時網頁的緩存行為。
metadata.CacheControl = "No-Cache";
// 設置元數據mykey1值為myval1。
metadata.UserMetadata.Add("mykey1", "myval1");
// 設置元數據mykey2值為myval2。
metadata.UserMetadata.Add("mykey2", "myval2");
var saveAsFilename = "文件名測試123.txt";
var contentDisposition = string.Format("attachment;filename*=utf-8''{0}", HttpUtils.EncodeUri(saveAsFilename, "utf-8"));
// 把請求所得的內容存為一個文件的時候提供一個默認的文件名。
metadata.ContentDisposition = contentDisposition;
// 上傳文件并設置文件元數據。
client.PutObject(bucketName, objectName, fs, metadata);
Console.WriteLine("Put object succeeded");
// 獲取文件元數據。
var oldMeta = client.GetObjectMetadata(bucketName, objectName);
// 設置新的文件元數據。
var newMeta = new ObjectMetadata()
{
ContentType = "application/octet-stream",
ExpirationTime = DateTime.Parse("2035-11-11T00:00:00.000Z"),
// 指定文件被下載時的內容編碼格式。
ContentEncoding = null,
CacheControl = ""
};
// 增加自定義元數據。
newMeta.UserMetadata.Add("author", "oss");
newMeta.UserMetadata.Add("flag", "my-flag");
newMeta.UserMetadata.Add("mykey2", "myval2-modified-value");
// 通過ModifyObjectMeta方法修改文件元數據。
client.ModifyObjectMeta(bucketName, objectName, newMeta);
}
}
catch (Exception ex)
{
Console.WriteLine("Put object failed, {0}", ex.Message);
}
// 創建同步獲取文件元數據請求。
// 依次填寫Bucket名稱(例如examplebucket)和Object完整路徑(例如exampledir/exampleobject.txt)。Object完整路徑中不能包含Bucket名稱。
HeadObjectRequest head = new HeadObjectRequest("examplebucket", "exampledir/exampleobject.txt");
// 獲取文件元數據。
OSSAsyncTask task = oss.asyncHeadObject(head, new OSSCompletedCallback<HeadObjectRequest, HeadObjectResult>() {
@Override
public void onSuccess(HeadObjectRequest request, HeadObjectResult result) {
// 獲取文件長度。
Log.d("headObject", "object Size: " + result.getMetadata().getContentLength());
// 獲取文件類型。
Log.d("headObject", "object Content Type: " + result.getMetadata().getContentType());
}
@Override
public void onFailure(HeadObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 請求異常。
if (clientExcepion != null) {
// 本地異常,如網絡異常等。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服務異常。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
// task.waitUntilFinished(); //等待任務完成。
package main
import (
"log"
"strings"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創建OSSClient實例。
// yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
// yourRegion填寫Bucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫Bucket名稱,例如examplebucket。
bucketName := "examplebucket" // 請替換為實際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 設置文件元數據,例如指定過期時間為2049年01月10日 23:00:00 GMT,訪問權限為公共讀,自定義元數據為MyProp(取值MyPropVal)。
expires := time.Date(2049, time.January, 10, 23, 0, 0, 0, time.UTC)
options := []oss.Option{
oss.Expires(expires),
oss.ObjectACL(oss.ACLPublicRead),
oss.Meta("MyProp", "MyPropVal"),
}
// 使用數據流上傳文件。
// 填寫Object的完整路徑,完整路徑中不包含Bucket名稱,例如exampledir/exampleobject.txt。
objectName := "exampledir/exampleobject.txt" // 請替換為實際的對象路徑
err = bucket.PutObject(objectName, strings.NewReader("MyObjectValue"), options...)
if err != nil {
log.Fatalf("Failed to upload object: %v", err)
}
// 獲取文件元數據。
props, err := bucket.GetObjectDetailedMeta(objectName)
if err != nil {
log.Fatalf("Failed to get object detailed metadata: %v", err)
}
log.Printf("Object Meta: %+v\n", props)
}
OSSHeadObjectRequest * request = [OSSHeadObjectRequest new];
// 填寫Bucket名稱,例如examplebucket。
request.bucketName = @"examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
request.objectKey = @"exampledir/exampleobject.txt";
OSSTask * headTask = [client headObject:request];
[headTask continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"head object success!");
OSSHeadObjectResult * result = task.result;
NSLog(@"header fields: %@", result.httpResponseHeaderFields);
for (NSString * key in result.objectMeta) {
NSLog(@"ObjectMeta: %@ - %@", key, [result.objectMeta objectForKey:key]);
}
} else {
NSLog(@"head object failed, error: %@" ,task.error);
}
return nil;
}];
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號信息。*/
/* yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫Bucket所在地域對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫Bucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網絡等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 設置HTTP header。*/
auto meta = ObjectMetaData();
meta.setContentType("text/plain");
meta.setCacheControl("max-age=3");
/* 設置自定義文件元數據。*/
meta.UserMetaData()["meta"] = "meta-value";
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "Thank you for using Aliyun Object Storage Service!";
auto outcome = client.PutObject(BucketName, ObjectName, content, meta);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "PutObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網絡等資源。*/
ShutdownSdk();
return 0;
}
#include "oss_api.h"
#include "aos_http_io.h"
/*yourEndpoint填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。*/
const char *endpoint = "yourEndpoint";
/* 填寫Bucket名稱,例如examplebucket。*/
const char *bucket_name = "examplebucket";
/* 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
const char *object_name = "exampledir/exampleobject.txt";
const char *object_content= "hello world";
/* yourRegion填寫Bucket所在地域對應的Region。以華東1(杭州)為例,Region填寫為cn-hangzhou。*/
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* 用char*類型的字符串初始化aos_string_t類型。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
//需要額外配置以下兩個參數
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* 是否使用了CNAME。0表示不使用。*/
options->config->is_cname = 0;
/* 用于設置網絡相關參數,比如超時時間等。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* 在程序入口調用aos_http_io_initialize方法來初始化網絡、內存等全局資源。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* 用于內存管理的內存池(pool),等價于apr_pool_t。其實現代碼在apr庫中。*/
aos_pool_t *pool;
/* 重新創建一個內存池,第二個參數是NULL,表示沒有繼承其它內存池。*/
aos_pool_create(&pool, NULL);
/* 創建并初始化options,該參數包括endpoint、access_key_id、acces_key_secret、is_cname、curl等全局配置信息。*/
oss_request_options_t *oss_client_options;
/* 在內存池中分配內存給options。*/
oss_client_options = oss_request_options_create(pool);
/* 初始化Client的選項oss_client_options。*/
init_options(oss_client_options);
/* 初始化參數。*/
aos_string_t bucket;
aos_string_t object;
aos_table_t *headers;
aos_list_t buffer;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_buf_t *content = NULL;
char *content_length_str = NULL;
char *object_type = NULL;
char *object_author = NULL;
int64_t content_length = 0;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
headers = aos_table_make(pool, 2);
/* 設置用戶自定義元數據。*/
apr_table_set(headers, "Expires", "Fri, 28 Feb 2032 05:38:42 GMT");
apr_table_set(headers, "x-oss-meta-author", "oss");
aos_list_init(&buffer);
content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
aos_list_add_tail(&content->node, &buffer);
/* 從緩存中上傳文件。*/
resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object,
&buffer, headers, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("put object from buffer with md5 succeeded\n");
} else {
printf("put object from buffer with md5 failed\n");
}
/* 獲取文件元數據。*/
resp_status = oss_get_object_meta(oss_client_options, &bucket, &object, &resp_headers);
if (aos_status_is_ok(resp_status)) {
content_length_str = (char*)apr_table_get(resp_headers, OSS_CONTENT_LENGTH);
if (content_length_str != NULL) {
content_length = atol(content_length_str);
}
object_author = (char*)apr_table_get(resp_headers, OSS_AUTHORIZATION);
object_type = (char*)apr_table_get(resp_headers, OSS_OBJECT_TYPE);
printf("get object meta succeeded, object author:%s, object type:%s, content_length:%ld\n", object_author, object_type, content_length);
} else {
printf("req:%s, get object meta failed\n", resp_status->req_id);
}
/* 釋放內存池,相當于釋放了請求過程中各資源分配的內存。*/
aos_pool_destroy(pool);
/* 釋放之前分配的全局資源。*/
aos_http_io_deinitialize();
return 0;
}
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# 填寫Bucket名稱,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# 簡單上傳時設置文件元數據。
bucket.put_object(
'my-object-1',
:file => 'local-file',
:metas => {'year' => '2016', 'people' => 'mary'})
# 追加上傳時設置文件元數據。
bucket.append_object(
'my-object-2', 0,
:file => 'local-file',
:metas => {'year' => '2016', 'people' => 'mary'})
# 斷點續傳上傳時設置文件元數據。
bucket.resumable_upload(
'my-object',
'local-file',
:metas => {'year' => '2016', 'people' => 'mary'})
使用命令行工具ossutil
關于使用ossutil設置Object元數據的具體操作,請參見set-meta(管理文件元數據)。
使用REST API
如果您的程序自定義要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多信息,請參見PutObject。