オブジェクトがアップロードされると、Object Storage Service (OSS) はアプリケーションサーバのコールバックプロセスを開始できます。アップロードコールバックを構成するには、OSS に送信されるアップロードリクエストに必要なコールバックパラメータを追加するだけです。
シナリオ
アップロードコールバックの典型的なシナリオは、サードパーティのアップロードを承認することです。アップロードコールバックを使用することで、クライアントロジックを簡素化し、ネットワークリソースを節約できます。次の図は、アップロードコールバックの仕組みを示しています。
クライアントは、クライアントから OSS に送信されるアップロードリクエストでアップロードコールバックを指定します。
アップロードタスクが完了すると、OSS はアプリケーションサーバにアップロードコールバックの HTTP リクエストを送信します。 callbackUrl はアプリケーションサーバのパブリック URL です。
アプリケーションサーバは、アップロードが完了したことを示すリクエストを受信します。次に、アプリケーションサーバはデータベースの変更などの操作を実行し、OSS から送信されたリクエストに応答します。
OSS は応答を受信すると、アップロード結果をクライアントに返します。
OSS がアプリケーションサーバに POST コールバックリクエストを送信すると、OSS は POST リクエスト本文に特定の情報を含むパラメータを含めます。
パラメータは、バケット名とオブジェクト名を指定するために使用されるパラメータなど、システム定義のパラメータと、リクエスト元の ID など、アプリケーションロジックに関連する特定の情報を含むカスタムパラメータの 2 つのカテゴリに分類されます。
注意事項
シンプルアップロード(PutObject)、フォームアップロード(PostObject)、およびマルチパートアップロード(CompleteMultipartUpload)のみがアップロードコールバックをサポートしています。
オブジェクトが OSS にアップロードされると、OSS はコールバックリクエストを送信して、オブジェクトのアップロードをアプリケーションサーバに通知します。これにより、アプリケーションサーバはデータ更新や通知などの後続の操作を実行できます。アップロードされたオブジェクトは、アップロードコールバックが成功したか失敗したかに関係なく、OSS に保存されます。
手順
OSS SDK の使用
次のサンプルコードは、一般的なプログラミング言語の OSS SDK を使用してアップロードコールバックを構成する方法の例を示しています。他のプログラミング言語の OSS SDK を使用してアップロードコールバックを構成する方法の詳細については、「概要」をご参照ください。
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.ByteArrayInputStream;
public class Demo {
public static void main(String[] args) throws Exception{
// リージョンのエンドポイントを指定します。この例では、中国 (杭州) リージョンのエンドポイントが使用されています。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。例: examplebucket。
String bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。例: exampledir/exampleobject.txt。完全なパスにバケット名を含めないでください。
String objectName = "exampledir/exampleobject.txt";
// コールバックリクエストの送信先サーバーのアドレスを指定します。例: https://example.com:23450。
String callbackUrl = "yourCallbackServerUrl";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成し、署名バージョンを V4 に設定します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
String content = "Hello OSS";
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName,new ByteArrayInputStream(content.getBytes()));
// アップロードコールバックパラメーターを構成します。
Callback callback = new Callback();
callback.setCallbackUrl(callbackUrl);
// (オプション) コールバックリクエストヘッダーの CallbackHost フィールドを指定します。
// callback.setCallbackHost("yourCallbackHost");
// コールバックリクエスト本文を JSON 形式で設定し、その中にプレースホルダー変数を定義します。
callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
callback.setCallbackBody("{\\\"bucket\\\":${bucket},\\\"object\\\":${object},\\\"mimeType\\\":${mimeType},\\\"size\\\":${size},\\\"my_var1\\\":${x:var1},\\\"my_var2\\\":${x:var2}}");
// コールバックリクエストのカスタムパラメーターを構成します。各カスタムパラメーターはキーと値で構成されます。キーは 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("OSSException がキャッチされました。これは、リクエストが OSS に到達したものの、"
+ "何らかの理由でエラーレスポンスで拒否されたことを意味します。");
System.out.println("エラーメッセージ:" + oe.getErrorMessage());
System.out.println("エラーコード:" + oe.getErrorCode());
System.out.println("リクエスト ID:" + oe.getRequestId());
System.out.println("ホスト ID:" + oe.getHostId());
} catch (Throwable ce) {
System.out.println("ClientException がキャッチされました。これは、クライアントが OSS と通信しようとしているときに、"
+ "ネットワークにアクセスできないなど、重大な内部問題が発生したことを意味します。");
System.out.println("エラーメッセージ:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}import base64
import argparse
import alibabacloud_oss_v2 as oss
parser = argparse.ArgumentParser(description="put object sample")
# 必須パラメーターを追加します
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
parser.add_argument('--bucket', help='バケットの名前。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
parser.add_argument('--key', help='オブジェクトの名前。', required=True)
parser.add_argument('--call_back_url', help='コールバックサーバーアドレス。', required=True)
def main():
args = parser.parse_args()
# 環境変数からアクセス認証情報を取得します
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK クライアントを構成します
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# OSS クライアントを作成します
client = oss.Client(cfg)
# アップロードするコンテンツ (文字列)
data = 'hello world'
# コールバックパラメーターを構築します。コールバックアドレスとコールバックリクエスト本文を指定し、Base64 エンコーディングを使用します
callback=base64.b64encode(str('{\"callbackUrl\":\"' + args.call_back_url + '\",\"callbackBody\":\"bucket=${bucket}&object=${object}&my_var_1=${x:var1}&my_var_2=${x:var2}\"}').encode()).decode(),
# カスタム変数 (callback-var) を構築し、Base64 エンコーディングを使用します
callback_var=base64.b64encode('{\"x:var1\":\"value1\",\"x:var2\":\"value2\"}'.encode()).decode(),
# コールバックパラメーターを使用してアップロードリクエストを開始します
result = client.put_object(oss.PutObjectRequest(
bucket=args.bucket,
key=args.key,
body=data,
callback=callback,
callback_var=callback_var,
))
# 戻り結果を出力します (ステータスコード、リクエスト ID などを含む)
print(vars(result))
if __name__ == "__main__":
main()const OSS = require("ali-oss");
varpath = require("path");
const client = new OSS({
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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,
authorizationV4: true,
// バケットの名前を指定します。
bucket: "examplebucket",
});
const options = {
callback: {
// コールバックリクエストを受信するコールバックサーバーのアドレスを指定します。例: http://oss-demo.aliyuncs.com:23450。
url: "http://oss-demo.aliyuncs.com:23450",
// (オプション) コールバックリクエストヘッダーに含まれる Host フィールドを指定します。
//host: 'yourCallbackHost',
// コールバックリクエストの本文を指定します。
body: "bucket=${bucket}&object=${object}&var1=${x:var1}&var2=${x:var2}",
// コールバックリクエストの Content-Type を指定します。
contentType: "application/x-www-form-urlencoded",
// クライアントからコールバックリクエストが開始されたときに、OSS が callbackUrl で指定されたオリジンアドレスにサーバー名表示 (SNI) を送信するかどうかを指定します。
callbackSNI: true,
// コールバックリクエストのカスタムパラメーターを構成します。
customValue: {
var1: "value1",
var2: "value2",
},
},
};
async function put() {
try {
// オブジェクトとローカルファイルの完全なパスを指定します。オブジェクトの完全なパスにバケット名を含めないでください。
// デフォルトでは、ローカルファイルのパスを指定しないと、サンプルプログラムが属するプロジェクトのローカルパスからファイルがアップロードされます。
let result = await client.put(
"exampleobject.txt",
path.normalize("/localpath/examplefile.txt"),
options
);
console.log(result);
} catch (e) {
console.log(e);
}
}
put();
using System;
using System.IO;
using System.Text;
using Aliyun.OSS;
using Aliyun.OSS.Common;
using Aliyun.OSS.Util;
namespace Callback
{
class Program
{
static void Main(string[] args)
{
Program.PutObjectCallback();
Console.ReadKey();
}
public static void PutObjectCallback()
{
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケットの名前を指定します。例: examplebucket。
var bucketName = "examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
var objectName = "exampledir/exampleobject.txt";
// アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。デフォルトでは、ローカルファイルのパスを指定しないと、サンプルプログラムが属するプロジェクトのローカルパスからファイルがアップロードされます。
var localFilename = "D:\\localpath\\examplefile.txt";
// コールバックサーバーの URL を指定します。例: https://example.com:23450。
const string callbackUrl = "yourCallbackServerUrl";
// コールバックリクエストに含まれる callbackBody フィールドを指定します。
const string callbackBody = "bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&" +
"my_var1=${x:var1}&my_var2=${x:var2}";
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
const string endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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);
client.SetRegion(region);
try
{
string responseContent = "";
var metadata = BuildCallbackMetadata(callbackUrl, callbackBody);
using (var fs = File.Open(localFilename, FileMode.Open))
{
var putObjectRequest = new PutObjectRequest(bucketName, objectName, fs, metadata);
var result = client.PutObject(putObjectRequest);
responseContent = GetCallbackResponse(result);
}
Console.WriteLine("オブジェクトの配置:{0} 成功、コールバックレスポンスコンテンツ:{1}", objectName, responseContent);
}
catch (OssException ex)
{
Console.WriteLine("エラーコード:{0} で失敗しました。エラー情報:{1}。 \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("エラー情報:{0} で失敗しました。", ex.Message);
}
}
// アップロードコールバックを構成します。
private static ObjectMetadata BuildCallbackMetadata(string callbackUrl, string callbackBody)
{
string callbackHeaderBuilder = new CallbackHeaderBuilder(callbackUrl, callbackBody).Build();
string CallbackVariableHeaderBuilder = new CallbackVariableHeaderBuilder().
AddCallbackVariable("x:var1", "x:value1").AddCallbackVariable("x:var2", "x:value2").Build();
var metadata = new ObjectMetadata();
metadata.AddHeader(HttpHeaders.Callback, callbackHeaderBuilder);
metadata.AddHeader(HttpHeaders.CallbackVar, CallbackVariableHeaderBuilder);
return metadata;
}
// アップロードコールバックリクエストへのレスポンスを読み取ります。
private static string GetCallbackResponse(PutObjectResult putObjectResult)
{
string callbackResponse = null;
using (var stream = putObjectResult.ResponseStream)
{
var buffer = new byte[4 * 1024];
var bytesRead = stream.Read(buffer, 0, buffer.Length);
callbackResponse = Encoding.Default.GetString(buffer, 0, bytesRead);
}
return callbackResponse;
}
}
}// アップロードリクエストを構築します。
// バケット名、オブジェクトの完全なパス、およびローカルファイルの完全なパスを指定します。この例では、バケット名は examplebucket、オブジェクトの完全なパスは exampledir/exampleobject.txt、ローカルファイルの完全なパスは /storage/emulated/0/oss/examplefile.txt です。
// オブジェクトの完全なパスにバケット名を含めないでください。
PutObjectRequest put = new PutObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");
put.setCallbackParam(new HashMap<String, String>() {
{
put("callbackUrl", "http://oss-demo.aliyuncs.com:23450");
put("callbackHost", "yourCallbackHost");
put("callbackBodyType", "application/json");
put("callbackBody", "{\"mimeType\":${mimeType},\"size\":${size}}");
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.d("PutObject", "UploadSuccess");
// 返されたコールバック情報を取得します。リクエストで servercallback を指定した場合にのみ、コールバック情報を取得できます。
String serverCallbackReturnJson = result.getServerCallbackReturnBody();
Log.d("servercallback", serverCallbackReturnJson);
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// 例外を処理します。
}
});
OSSPutObjectRequest * request = [OSSPutObjectRequest new];
// バケットの名前を指定します。例: examplebucket。
request.bucketName = @"examplebucket";
// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
request.objectKey = @"exampledir/exampleobject.txt";
request.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
// コールバックパラメーターを構成します。
request.callbackParam = @{
@"callbackUrl": @"<your server callback address>",
@"callbackBody": @"<your callback body>"
};
// カスタム変数を指定します。
request.callbackVar = @{
@"<var1>": @"<value1>",
@"<var2>": @"<value2>"
};
request.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
OSSTask * task = [client putObject:request];
[task continueWithBlock:^id(OSSTask *task) {
if (task.error) {
OSSLogError(@"%@", task.error);
} else {
OSSPutObjectResult * result = task.result;
NSLog(@"Result - requestId: %@, headerFields: %@, servercallback: %@",
result.requestId,
result.httpResponseHeaderFields,
result.serverReturnJsonString);
}
return nil;
}];
// タスクが完了するまで同期ブロッキングを実装します。
// [task waitUntilFinished]; #include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS にアクセスするために使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
std::string Region = "yourRegion";
/* バケットの名前を指定します。例: examplebucket。 */
std::string BucketName = "examplebucket";
/* オブジェクトの完全なパスを指定します。オブジェクトの完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
std::string ObjectName = "exampledir/exampleobject.txt";
/* コールバックサーバーの URL を指定します。 */
std::string ServerName = "https://example.aliyundoc.com:23450";
/* ネットワークリソースなどのリソースを初期化します。 */
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);
std::shared_ptr<std::iostream> content = std::make_shared<std::stringstream>();
*content << "Thank you for using Aliyun Object Storage Service!";
/* アップロードコールバックパラメーターを構成します。 */
std::string callbackBody = "bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&my_var1=${x:var1}";
ObjectCallbackBuilder builder(ServerName, callbackBody, "", ObjectCallbackBuilder::Type::URL);
std::string value = builder.build();
ObjectCallbackVariableBuilder varBuilder;
varBuilder.addCallbackVariable("x:var1", "value1");
std::string varValue = varBuilder.build();
PutObjectRequest request(BucketName, ObjectName, content);
request.MetaData().addHeader("x-oss-callback", value);
request.MetaData().addHeader("x-oss-callback-var", varValue);
auto outcome = client.PutObject(request);
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}#include "oss_api.h"
#include "aos_http_io.h"
/* バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケットの名前を指定します。例: examplebucket。 */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。 */
const char *object_name = "exampledir/exampleobject.txt";
const char *object_content = "More than just cloud.";
/* バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを 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"));
// 2 つの追加パラメーターを指定します。
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* CNAME を使用するかどうかを指定します。値 0 は、CNAME が使用されていないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを構成します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
aos_pool_t *p = NULL;
aos_status_t *s = NULL;
aos_string_t bucket;
aos_string_t object;
aos_table_t *headers = NULL;
oss_request_options_t *options = NULL;
aos_table_t *resp_headers = NULL;
aos_list_t resp_body;
aos_list_t buffer;
aos_buf_t *content;
char *buf = NULL;
int64_t len = 0;
int64_t size = 0;
int64_t pos = 0;
char b64_buf[1024];
int b64_len;
/* JSON 形式でコールバックパラメーターを指定します。 */
/* (オプション) コールバックリクエストヘッダーに含まれる Host フィールドを指定します。 */
char *callback = "{"
"\"callbackUrl\":\"http://oss-demo.aliyuncs.com:23450\","
"\"callbackHost\":\"yourCallbackHost\","
"\"callbackBody\":\"bucket=${bucket}&object=${object}&size=${size}&mimeType=${mimeType}\","
"\"callbackBodyType\":\"application/x-www-form-urlencoded\""
"}";
/* main() で aos_http_io_initialize メソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* パラメーターを初期化します。 */
aos_pool_create(&p, NULL);
options = oss_request_options_create(p);
init_options(options);
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_list_init(&resp_body);
aos_list_init(&buffer);
content = aos_buf_pack(options->pool, object_content, strlen(object_content));
aos_list_add_tail(&content->node, &buffer);
/* ヘッダーにコールバックを追加します。 */
b64_len = aos_base64_encode((unsigned char*)callback, strlen(callback), b64_buf);
b64_buf[b64_len] = '\0';
headers = aos_table_make(p, 1);
apr_table_set(headers, OSS_CALLBACK, b64_buf);
/* アップロードコールバックを構成します。 */
s = oss_do_put_object_from_buffer(options, &bucket, &object, &buffer,
headers, NULL, NULL, &resp_headers, &resp_body);
if (aos_status_is_ok(s)) {
printf("バッファーからのオブジェクトの配置に成功しました\n");
} else {
printf("バッファーからのオブジェクトの配置に失敗しました\n");
}
/* バッファーの長さを取得します。 */
len = aos_buf_list_len(&resp_body);
buf = (char *)aos_pcalloc(p, (apr_size_t)(len + 1));
buf[len] = '\0';
/* バッファーの内容をメモリにコピーします。 */
aos_list_for_each_entry(aos_buf_t, content, &resp_body, node) {
size = aos_buf_size(content);
memcpy(buf + pos, content->pos, (size_t)size);
pos += size;
}
/* メモリプールを解放します。この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
aos_pool_destroy(p);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# この例では、中国 (杭州) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
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'],
# バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
region: 'cn-hangzhou'
)
# バケットの名前を指定します。例: examplebucket。
bucket_name = 'examplebucket'
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# コールバックサーバーの URL を指定します。例: https://example.com:23450。
callback_url = 'yourCallbackServerUrl'
# アップロードする文字列を指定します。
content = 'Hello OSS'
# コールバックパラメーターを構成します。
callback = {
callbackUrl: callback_url,
callbackBody: 'bucket=${bucket}&object=${object}&mimeType=${mimeType}&size=${size}&my_var1=${x:var1}&my_var2=${x:var2}',
callbackBodyType: 'application/x-www-form-urlencoded'
}
# カスタム変数を指定します。
callback_var = {
'x:var1' => 'value1',
'x:var2' => 'value2'
}
begin
# オブジェクトをアップロードし、コールバックパラメーターを指定します。
result = client.put_object(bucket_name, object_name, content, callback: callback, callback_var: callback_var)
# アップロードコールバックから返されたメッセージコンテンツを読み取ります。
puts result.response_body
rescue StandardError => e
puts "アップロードコールバックの構成中にエラーが発生しました: #{e.message}"
end
package main
import (
"context"
"encoding/base64"
"encoding/json"
"flag"
"log"
"strings"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を指定します。
var (
region string // バケットが配置されているリージョン。
bucketName string // バケットの名前。
objectName string // オブジェクトの名前。
)
// コマンドラインパラメータを初期化するために使用する init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}
func main() {
// コマンドラインパラメータを解析します。
flag.Parse()
// バケット名が空かどうかを確認します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、バケット名が必要です。")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、リージョンが必要です。")
}
// オブジェクト名が空かどうかを確認します。
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメータ、オブジェクト名が必要です。")
}
// デフォルト設定を読み込み、資格情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSSClient インスタンスを作成します。
client := oss.NewClient(cfg)
// コールバックパラメータを指定します。
callbackMap := map[string]string{
"callbackUrl": "http://example.com:23450", // コールバックサーバーの URL を指定します。例: https://example.com:23450。
"callbackBody": "bucket=${bucket}&object=${object}&size=${size}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}", // コールバックリクエスト本文を指定します。
"callbackBodyType": "application/x-www-form-urlencoded", // コールバックリクエスト本文のタイプを指定します。
}
// コールバックパラメータの設定を JSON 文字列に変換し、文字列を Base64 でエンコードしてコールバック設定を渡します。
callbackStr, err := json.Marshal(callbackMap)
if err != nil {
log.Fatalf("コールバックマップのマーシャリングに失敗しました: %v", err)
}
callbackBase64 := base64.StdEncoding.EncodeToString(callbackStr)
callbackVarMap := map[string]string{}
callbackVarMap["x:my_var1"] = "thi is var 1"
callbackVarMap["x:my_var2"] = "thi is var 2"
callbackVarStr, err := json.Marshal(callbackVarMap)
if err != nil {
log.Fatalf("コールバック変数のマーシャリングに失敗しました: %v", err)
}
callbackVarBase64 := base64.StdEncoding.EncodeToString(callbackVarStr)
// アップロードする文字列を指定します。
body := strings.NewReader("Hello, OSS!") // アップロードする文字列。
// ローカルファイルをアップロードするリクエストを作成します。
request := &oss.PutObjectRequest{
Bucket: oss.Ptr(bucketName), // バケットの名前。
Key: oss.Ptr(objectName), // オブジェクトの名前。
Body: body, // オブジェクトの内容。
Callback: oss.Ptr(callbackBase64), // コールバックパラメータ。
CallbackVar: oss.Ptr(callbackVarBase64),
}
// ローカルファイルをアップロードするリクエストを実行します。
result, err := client.PutObject(context.TODO(), request)
if err != nil {
log.Fatalf("オブジェクトの配置に失敗しました %v", err)
}
// オブジェクトアップロード操作の結果を表示します。
log.Printf("オブジェクト配置結果:%#v\n", result)
}
<?php
// Introduce autoload files to load dependent libraries.
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// Specify descriptions for command line parameters.
$optsdesc = [
"region" => ['help' => The region in which the bucket is located.', 'required' => True], // (Required) Specify the region in which the bucket is located.
"endpoint" => ['help' => The domain names that other services can use to access OSS.', 'required' => False], // (Optional) Specify the endpoint that can be used by other services to access OSS.
"bucket" => ['help' => The name of the bucket, 'required' => True], // (Required) Specify the name of the bucket.
"key" => ['help' => The name of the object, 'required' => True], // (Required) Specify the name of the object.
];
// Convert the parameter descriptions to a long options list required by getopt.
// Add a colon (:) to the end of each parameter to indicate that a value is required.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Parse the command line parameters.
$options = getopt("", $longopts);
// Check whether the required parameters are configured.
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // Obtain the help information about the parameters.
echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
exit(1); // If the required parameters are not configured, exit the program.
}
}
// Obtain values from the parsed parameters.
$region = $options["region"]; // The region in which the bucket is located.
$bucket = $options["bucket"]; // The name of the bucket.
$key = $options["key"]; // The name of the object.
// Obtain access credentials from environment variables.
// Obtain the AccessKey ID and AccessKey secret from the EnvironmentVariableCredentialsProvider environment variable.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// Use the default configurations of the SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Specify the credential provider.
$cfg->setRegion($region); // Specify the region in which the bucket is located.
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // Specify the endpoint if an endpoint is provided.
}
// Create an OSSClient instance.
$client = new Oss\Client($cfg);
// Specify the information about the callback server.
// Specify the callback URL, which is the address of the server that receives the callback request.
// Specify the callback host, which is the hostname of the callback server.
// Specify the callback body, which is the template that is used to specify the callback content. A dynamic placeholder is supported.
// Specify the type of the callback body, which is the format of the callback content.
$callback = base64_encode(json_encode(array(
'callbackUrl' => yourCallbackServerUrl, // Replace yourCallbackServerUrl with the actual callback server URL.
'callbackHost' => 'CallbackHost', // Replace CallbackHost with the actual callback server hostname.
'callbackBody' => 'bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&my_var1=${x:var1}&my_var2=${x:var2}',
'callbackBodyType' => "application/x-www-form-urlencoded", // Specify the format of the callback content.
)));
// Specify custom variables to pass additional information in the callback.
$callbackVar = base64_encode(json_encode(array(
'x:var1' => "value1", // Specify the first custom variable.
'x:var2' => 'value2', // Specify the second custom variable.
)));
// Create a PutObjectRequest object to upload the local file.
$request = new Oss\Models\PutObjectRequest(bucket: $bucket, key: $key);
$request->callback = $callback; // Specify callback information.
$request->callbackVar = $callbackVar; // Specify the custom variables.
// Execute the simple upload request.
$result = $client->putObject($request);
// Display the result of the simple upload request.
// Display the HTTP status code, the request ID, and the callback result to check whether the request is successful.
printf(
'status code:' . $result->statusCode . PHP_EOL . // The HTTP status code. For example, HTTP status code 200 indicates that the request is successful.
'request id:' . $result-> requestId. PHP_EOL // The request ID, which is used to debug or trace a request.
'callback result:' . var_export($result->callbackResult, true) . PHP_EOL // The details of the callback result.
);
関連 API 操作
上記のメソッドは基本的に RESTful API に基づいて実装されており、ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。API を直接呼び出すには、コードに署名計算を含める必要があります。詳細については、「コールバック」をご参照ください。
参考資料
アップロードコールバックの構成時に発生する可能性のある一般的なエラーとその原因の詳細については、「アップロードコールバックエラーのトラブルシューティング方法」をご参照ください。
POST ポリシーに基づいてさまざまなプログラミング言語でサーバーから署名情報を取得し、アップロードコールバックを構成してから、フォームアップロードを使用して OSS に直接データをアップロードする方法の詳細については、「サーバーに署名を追加し、アップロードコールバックを構成して、データを直接転送する」をご参照ください。
モバイルアプリの OSS ベースの直接データ転送サービスを設定し、アップロードコールバックを構成する方法の詳細については、「モバイルアプリのアップロードコールバックを設定する」をご参照ください。