すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:追加アップロード

最終更新日:Feb 23, 2024

追加アップロードを実行して、追加可能オブジェクトにコンテンツを追加できます。

前提条件

バケット作成についての 詳細については、「バケットの作成」をご参照ください。

背景情報

シンプルアップロードを使用してアップロードされたオブジェクトは、通常のオブジェクトと見なされます。 マルチパートアップロードを使用してアップロードされたオブジェクトは、マルチパートオブジェクトと見なされます。 詳細については、「簡易アップロード」および「マルチパートアップロード」をご参照ください。 通常およびマルチパートオブジェクトのコンテンツは、オブジェクトがアップロードされた後にのみ読み取ることができ、変更することはできません。 既存の通常オブジェクトまたはマルチパートオブジェクトのコンテンツを変更するには、既存のオブジェクトと同じ名前のオブジェクトをアップロードして、既存のオブジェクトを上書きする必要があります。

簡易アップロードまたはマルチパートアップロードを使用して、監視サービスおよびライブストリーミングサービスによって生成されたリアルタイムビデオストリームをアップロードする場合、特定のルールに基づいてストリームをパーツに分割し、新しいパーツを個別のオブジェクトとしてオブジェクトストレージサービス (OSS) に継続的にアップロードする必要があります。 このシナリオでのシンプルアップロードとマルチパートアップロードには、次の欠点があります。

  • オブジェクト分割などの側面を処理するには、複雑なアーキテクチャが必要です。

  • アップロードされたオブジェクトのリストなど、オブジェクトメタデータを格納するためのストレージ容量を確保する必要があります。 各リクエストには、新しいオブジェクトがアップロードされるかどうかを確認するメタデータクエリが含まれます。 この場合、クライアントはアップロードごとに2つのリクエストを送信する必要があり、ネットワークの待ち時間とサーバーの作業負荷が増加します。

  • ストリームが少数の部分に分割される場合、ネットワーク待ち時間は低いが、オブジェクト管理はより複雑になる。 ストリームが多数の部分に分割される場合、ネットワーク待ち時間は著しく増加する。

アップロードされたオブジェクトのビデオストリームをリアルタイムで更新する場合は、ローカルビデオマージを実行し、AppendObjectを呼び出してビデオコンテンツをアップロードできます。 AppendObjectを呼び出してアップロードされるオブジェクトは、追加可能なオブジェクトです。 既存の追加可能オブジェクトにコンテンツを追加できます。 追加可能なオブジェクトに追加されたデータはすぐに読み取ることができます。

メリット

追加アップロードを使用して、ビデオストリームによって生成されたデータを1つのオブジェクトにアップロードできます。 クライアントは、オブジェクトの現在の長さを前回取得したオブジェクトの長さと定期的に比較して、新しいデータがアップロードされるかどうかを判断するだけです。 新しいデータが追加されたとクライアントが判断した場合、クライアントは、追加されたデータを取得する要求を送信する。 これにより、アーキテクチャを簡素化し、スケーラビリティを向上させることができます。

制限事項

  • オブジェクトサイズ

    追加アップロードを使用してアップロードできるオブジェクトのサイズは、5 GBを超えることはできません。

  • 操作

    • 追加アップロードを実行して、コンテンツをCold ArchiveまたはDeep Cold Archiveオブジェクトに追加することはできません。

    • 追加可能なオブジェクトはコピーできません。 ただし、追加可能なオブジェクトのメタデータは変更できます。

    • アップロードコールバックは、追加アップロードではサポートされません。

使用上の注意

  • コンテンツを追加するオブジェクトが存在しない場合、AppendObject操作を呼び出すと追加可能なオブジェクトが作成されます。

  • コンテンツを追加するオブジェクトが存在する場合:

    • オブジェクトが追加可能オブジェクトであり、追加操作の開始位置が現在のオブジェクトサイズに等しい場合、オブジェクトはオブジェクトの最後に追加されます。

    • オブジェクトが追加可能オブジェクトであり、追加操作の開始位置が現在のオブジェクトサイズと等しくない場合、PositionNotEqualToLengthエラーが返されます。

    • オブジェクトが追加可能オブジェクトでない場合、ObjectNotAppendableエラーが返されます。

手順

OSS SDKの使用

次のサンプルコードは、一般的なプログラミング言語でOSS SDKを使用して追加アップロードを実行する方法の例を示しています。 他のプログラミング言語でOSS SDKを使用して追加アップロードを実行する方法の詳細については、「概要」をご参照ください。

Aliyun.OSSを使用した
com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo del.AppendObjectRequestをインポートします。com.aliyun.oss.mo del.AppendObjectResultをインポートします。com.aliyun.oss.mo del.ObjectMetadataをインポートします。java.io.ByteArrayInputStreamをインポートします。public classデモ {

    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。 
        文字列objectName = "exampledir/exampleobject.txt";
        String content1 = "Hello OSS A \n";
        String content2 = "Hello OSS B \n";
        String content3 = "Hello OSS C \n";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            ObjectMetadata meta = new ObjectMetadata();
            // アップロードするコンテンツの種類を指定します。 
            meta.setContentType("text/plain");
            // オブジェクトのwebページのキャッシュ動作を指定します。 
            // meta.setCacheControl("no-cache");
            // オブジェクトのダウンロード時にオブジェクトの名前を指定します。 
            // meta.setContentDisposition("attachment;filename=oss_download.txt");
            // オブジェクトのコンテンツのエンコード形式を指定します。 
            // meta.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
            // 受信したメッセージの内容が送信したメッセージの内容と同じかどうかを確認するためのリクエストヘッダーを指定します。 
            // meta.setContentMD5("ohhnqLBJFiKkPSBO1eNaUA==");
            // 有効期限を指定します。 
            // try {
            // meta.setExpirationTime(DateUtil.parseRfc822Date("Wed、08 Jul 2022 16:57:01 GMT"));
            //} catch (ParseException e) {
            // e.printStackTrace();
            //}
            // サーバー側の暗号化方法を指定します。 この例では、メソッドはSSE-OSSに設定されています。 
            // meta.setServerSideEncryption(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
            // オブジェクトのACLを指定します。 この例では、オブジェクトのACLはprivateに設定されています。 
            // meta.setObjectAcl(CannedAccessControlList.Private);
            // オブジェクトのストレージクラスを指定します。 
            // meta.setHeader(OSSHeaders.OSS_STORAGE_CLASS、StorageClass.Standard);
            // AppendObject操作を呼び出して追加可能なオブジェクトを作成するときに、名前の先頭にx-oss-meta-* が付いたパラメーターを追加できます。 既存の追加可能オブジェクトにコンテンツを追加する場合、これらのパラメーターをリクエストに含めることはできません。 名前の先頭にx-oss-meta-* が付いているパラメータは、オブジェクトのメタデータと見なされます。 
            // meta.setHeader("x-oss-meta-author" 、"Alice");

            // AppendObjectRequestを使用して複数のパラメーターを設定します。 
            AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()),meta);

            // AppendObjectRequestを使用して単一のパラメーターを設定します。 
            // バケットの名前を指定します。 
            // appendObjectRequest.setBucketName(bucketName);
            // オブジェクトの名前を指定します。 
            // appendObjectRequest.setKey(objectName);
            // 追加するコンテンツを指定します。 InputStreamとFileの2種類のコンテンツがサポートされています。 この例では、コンテンツはInputStreamに設定されています。 
            //appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
            // 追加するコンテンツを指定します。 InputStreamとFileの2種類のコンテンツがサポートされています。 この例では、コンテンツは [ファイル] に設定されています。 
            // appendObjectRequest.setFile (新しいファイル ("D :\\ localpath\\examplefile.txt"));
            // オブジェクトメタデータを指定します。 オブジェクトに対して最初の追加操作を実行する場合にのみ、オブジェクトのメタデータを指定できます。 
            //appendObjectRequest.setMetadata(meta);

            // 最初の追加操作を実行します。 
            // 追加操作の開始位置を指定します。 
            appendObjectRequest.setPosition(0L);
            AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
            // オブジェクトのCRC-64値を計算します。 The value is calculated based on the ECMA-182 standard. 
            System.out.println(appendObjectResult.getObjectCRC());

            // Start the second append. 
            // NextPositionは、オブジェクトの長さである、次の追加操作の開始位置を指定します。 
            appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
            appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
            appendObjectResult = ossClient.appendObject(appendObjectRequest);

            // 3番目の追加操作を実行します。 
            appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
            appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
            appendObjectResult = ossClient.appendObject(appendObjectRequest);
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            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';
}

OSS\OssClientを使用します。OSS\Core\OssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。 
$bucket= "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 
$object = "exampleobject.txt";
// アップロードするローカルファイルのフルパスを指定します。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
$filePath = "D :\\ localpath\\examplefilea.txt";
$filePath1 = "D :\\ localpath\\examplefileb.txt";
$filePath2 = "D :\\ localpath\\examplefilec.txt";

try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    // 最初の追加操作を実行します。 最初の追加アップロードの位置は0で、次の追加アップロードの位置は応答に含まれます。 次の追加アップロードの開始位置は、オブジェクトの現在の長さです。 
    $position = $ossClient->appendFile($bucket, $object, $filePath, 0);
    $position = $ossClient->appendFile($bucket, $object, $filePath1, $position);
    $position = $ossClient->appendFile($bucket, $object, $filePath2, $position);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n"); 
const OSS = require('ali-OSS ')

const client = new OSS({
  // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 
  リージョン: 'yourRegion' 、
  // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、環境変数OSS_ACCESS_KEY_IDとOSS_ACCESS_KEY_SECRETが設定されていることを確認してください。 
  accessKeyId: process.env.OSS_ACCESS_KEY_ID、
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、
  // バケットの名前を指定します。 例: examplebucket. 
  bucket: 'examplebucket' 、});

const headers = {    
  // オブジェクトのアクセス制御リスト (ACL) を指定します。 
  'x-oss-object-acl': 'private' 、
  // オブジェクトのストレージクラスを指定します。 
  「x-oss-storage-classs」: 「標準」、  
  // サーバー側の暗号化方法を指定します。 この例では、SSE-OSSが使用されます。 
  'x-oss-server-side-encryption: 'AES256' 、};

async関数append () {
  // 最初の追加アップロード操作を実行します。 次の追加操作が開始される位置は、応答に含まれる。 
  // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: destfolder/examplefile.txt。 
  // ローカルファイルのフルパスを指定します。 フルパスにはサフィックスが含まれます。 例: /users/local/examplefile.txt 
  const result = await client.append('objectName', 'localFile ')
  // カスタムヘッダーとユーザーメタデータを指定します。 
  //,{headers} 
  )

  // 2番目の追加操作を実行します。 次の追加操作の開始位置は、オブジェクトの現在の長さであり、Content-lengthで指定されます。 
  result = await client.append('objectName', 'localFile ', {
    position: result.nextAppendPosition
  })
}

append();
# -*- coding: utf-8 -*-
oss2のインポート

# Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 これらの資格情報を使用してOSSで操作を実行することは、リスクの高い操作です。 RAMユーザーを使用してAPI操作を呼び出したり、ルーチンのO&Mを実行することを推奨します。RAMユーザーを作成するには、RAMコンソールにログインします。 
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
# バケットの名前を指定します。 例: examplebucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')

# 次のコードは、追加アップロードのヘッダーを指定する方法の例を示しています。# headers = dict()
# オブジェクトのwebページのキャッシュ動作を指定します。 
# headers['Cache-Control '] = 'no-cache'
# オブジェクトのダウンロード時にオブジェクトの名前を指定します。 
# headers['Content-Disposition'] = 'oss_MultipartUpload.txt'
# オブジェクトのコンテンツのエンコード形式を指定します。 
# headers['Content-Encoding'] = 'utf-8'
# 受信したメッセージの内容と送信したメッセージの内容が同じかどうかを確認するためのリクエストヘッダーを指定します。 
# headers['Content-MD5'] = 'ohhnqLBJFiKkPSBO1eNaUA=='
# 有効期限を指定します。 
# headers['Expires'] = 'Wed、08 Jul 2022 16:57:01 GMT'
# オブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、ACLはOBJECT_ACL_PRIVATEに設定されています。 
# headers['x-oss-object-acl'] = oss2.OBJECT_ACL_PRIVATE
# 追加アップロードで同じ名前のオブジェクトを上書きするかどうかを指定します。 
# headers['x-oss-forbid-overwrite'] = 'true'
# サーバー側の暗号化方法を指定します。 この例では、SSE-OSSはサーバー側の暗号化に指定されています。 
# headers[OSS_SERVER_SIDE_ENCRYPTION] = SERVER_SIDE_ENCRYPTION_AES256
# オブジェクトのストレージクラスを指定します。 
# headers['x-oss-storage-classs'] = oss2.BUCKET_STORAGE_CLASS_STANDARD
# AppendObject操作を呼び出して追加可能なオブジェクトを作成するときに、名前の先頭にx-oss-metaが付いているパラメーターを追加できます。 既存の追加可能オブジェクトにコンテンツを追加する場合、これらのパラメーターをリクエストに含めることはできません。 名前の先頭にx-oss-meta-が付いているパラメータは、オブジェクトのメタデータと見なされます。 
# headers['x-oss-meta-author'] = 'Alice'
# result = bucket.append_object(exampledir/exampleobject.txt, 0, 'content of first append', headers=headers)

# 最初の追加操作の開始位置を0に設定します。 
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
result = bucket.append_object('exampledir/exampleobject.txt ', 0, 'content of first append')
# オブジェクトにコンテンツを追加した場合は、最後の操作で返された応答のnext_positionフィールドから、またはbucket.head_objectを使用して、現在の追加操作の開始位置を取得できます。 
bucket.append_object('<yourObjectName>', result.next_position, 'content of second append') 
;

// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを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");
// バケットの名前を指定します。 例: examplebucket. 
var bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
var objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルのフルパスを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
var localFilename = "D :\\ localpath\\examplefile.txt";
// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
// 追加アップロードを実行して追加可能オブジェクトを作成する場合、追加操作の開始位置は0です。 次の追加操作の位置は、応答に含まれる。 次の追加アップロードの開始位置は、オブジェクトの現在の長さです。 
ロングポジション=0;
トライ
{
    var metadata = client.GetObjectMetadata(bucketName, objectName);
    position = metadata.ContentLength;
}
catch (例外) { }
トライ
{
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        var request = new AppendObjectRequest(bucketName, objectName)
        {
            ObjectMetadata = new ObjectMetadata(),
            Content = fs,
            Position = position
        };
        // 追加操作を実行します。 
        var result = client.AppendObject(request);
        // 追加操作の開始位置を指定します。 
        position = result.NextAppendPosition;
        Console.WriteLine("Append object succeeded, next append position:{0}", position);
    }
    // 次の追加操作の開始位置を照会し、2番目の追加操作を実行します。 
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        var request = new AppendObjectRequest(bucketName, objectName)
        {
            ObjectMetadata = new ObjectMetadata(),
            Content = fs,
            Position = position
        };
        var result = client.AppendObject(request);
        position = result.NextAppendPosition;
        Console.WriteLine("Append object succeeded, next append position:{0}", position);
    }
}
キャッチ (例外ex)
{
    Console.WriteLine("Append object failed, {0}", ex.Message);
} 
// バケットの名前、オブジェクトのフルパス、およびローカルファイルのフルパスを指定します。 この例では、バケットの名前はexamplebucket、オブジェクトのフルパスはexampledir/exampleobject.txt、ローカルファイルのフルパスは /storage/emulated/0/oss/examplefile.txtです。 
// オブジェクトのフルパスにバケット名を含めることはできません。 
AppendObjectRequest append = new AppendObjectRequest("examplebucket", "exampledir/exampleobject.txt", "/storage/emulated/0/oss/examplefile.txt");

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("text/plain");
append.setMetadata (メタデータ);

// 追加操作の開始位置を指定します。 
append.setPosition(0);

// コールバック関数を設定します。 
append.setProgressCallback(new OSSProgressCallback<AppendObjectRequest>() {
    @オーバーライド
    public void onProgress(AppendObjectRequest request, long currentSize, long totalSize) {
        Log.d("AppendObject", "currentSize: " + currentSize + "totalSize: " + totalSize);
    }
});
// 非同期モードで追加アップロード操作を実行します。 
OSSAsyncTask task = oss.asyncAppendObject(append, new OSSCompletedCallback<AppendObjectRequest, AppendObjectResult>() {
    @オーバーライド
    public void onSuccess(AppendObjectRequestリクエスト, AppendObjectResult結果) {
        Log.d("AppendObject", "AppendSuccess");
        Log.d("NextPosition", "+ result.getNextPosition());
    }

    @オーバーライド
    public void onFailure(AppendObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // Handle exceptions. 
    }
}); 
パッケージメイン

import (import (import)
    "fmt"
    "os"
    "strings"
    「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 {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // Create an OSSClient instance. 
    // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 実際のエンドポイントを指定します。 
    client, err := oss.New("yourEndpoint", ", " ", ", oss.SetCredentialsProvider(&provider))
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // バケットの名前を指定します。 例: examplebucket. 
    bucket, err := client.Bucket("examplebucket")
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
    objectName := "exampledir/exampleobject.txt"
    var nextPos int64 = 0
    // オブジェクトが初めて追加された場合、追加操作の開始位置は0です。 次の追加操作の位置は、応答に含まれる。 次の追加操作が開始される位置は、オブジェクトの現在の長さである。     
    // リクエストの有効期限を指定します。 
    有効期限:= time.Date(2021, time.December, 10, 23, 0, 0, 0, time.UTC)
    option := []oss. オプション {
        oss.Expires(expires),
        // オブジェクトのダウンロード時のwebページのキャッシュ動作を指定します。 
        // oss.CacheControl("no-cache") 、
        // ダウンロードされたときのオブジェクトの名前を指定します。 
        // oss.ContentDisposition("attachment;filename=FileName.txt") 、
        // オブジェクトのコンテンツエンコーディング形式を指定します。 
        // oss.ContentEncoding("gzip") 、
        // オブジェクトのストレージクラスを指定します。 
        // oss.ObjectStorageClass(oss.StorageStandard) 、
        // オブジェクトのACLを指定します。 
        // oss.ObjectACL(oss. ACLDrivate) 、
        // サーバー側の暗号化方法を指定します。 
        // oss.ServerSideEncryption("AES256") 、
        // AppendObject操作を呼び出して追加可能なオブジェクトを作成するときに、名前の先頭にx-oss-meta-* が付いたパラメーターを追加できます。 これらのパラメーターは、既存の追加可能オブジェクトにコンテンツを追加するリクエストに含めることはできません。 名前の先頭にx-oss-meta-* が付いているパラメータは、オブジェクトのメタデータと見なされます。 
        // oss.Meta("x-oss-meta-author" 、"Alice") 、
    }


    nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue1"), nextPos,option...)
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // オブジェクトにコンテンツを追加した場合、次のいずれかのメソッドを使用して、現在の追加操作の開始位置を取得できます。X-Oss-Next-append-position最後の追加操作とbucket. 
    // props, err := bucket.GetObjectDetailedMeta("objectName")
    // if err! =nil {
    // fmt.Println("Error:", err)
    // os.Exit(-1)
    //}
    // nextPos, err = strconv.ParseInt(props.Get("X-Oss-Next-Append-Position"), 10,64)
    // if err! =nil {
    // fmt.Println("Error:", err)
    // os.Exit(-1)
    //}

    // 2番目の追加操作を実行します。 
    nextPos, err = bucket.AppendObject(objectName, strings.NewReader("YourObjectAppendValue2"), nextPos)
    if err! =nil {
        fmt.Println("Error:", err,"aaa")
        os.Exit(-1)
    }

    // オブジェクトに対して追加操作を複数回実行できます。 
} 
OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];
// 必須フィールドを設定します。 bucketNameは、バケットの名前を示します。 objectKeyは、追加アップロードを使用してOSSにアップロードするオブジェクトのフルパスを示すobjectNameと同等です。 パスには、オブジェクトの拡張子を含める必要があります。 たとえば、objectKeyをabc/efg/123.jpg. に設定できます。 
append.bucketName = @ "<bucketName>";
append.objectKey = @ "<objectKey>";
// 最初の追加操作の開始位置を指定します。 
append.appendPosition = 0;
NSString * docDir = [self getDocumentDirectory];
append.uploadingFileURL = [NSURL fileURLWithPath:@ "<filepath>"];
// オプションのフィールドを設定します。 
append.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
    NSLog(@ "% lld, % lld, % lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
// append.contentType = @ "";
// append.contentMd5 = @ "";
// append.contentEncoding = @ "";
// append.contentDisposition = @ "";
OSSTask * appendTask = [client appendObject:append];
[appendTask continueWithBlock:^ id(OSSTask * task) {
    NSLog(@ "objectKey: % @", append.objectKey);
    if (!task.error) {
        NSLog(@ "append object success!");
        OSSAppendObjectResult * result = task.result;
        NSString * etag = result.eTag;
        long nextPosition = result.xOssNextAppendPosition;
    } else {
        NSLog(@ "append object failed, error: % @" , task.error);
    }
    nilを返します。}]; 
#include <alibabacloud/oss/OssClient.h>
名前空間listaCloud::OSSを使用します。int main(void)
{
    /* OSSへのアクセスに使用されるアカウントに関する情報を初期化します。 */
            
    /* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 */
    std::stringエンドポイント="https://oss-cn-hangzhou.aliyuncs.com";
    /* バケットの名前を指定します。 例: examplebucket. */
    std::string BucketName = "examplebucket";
    /* オブジェクトのフルパスを指定します。 オブジェクトのフルパスにバケット名を含めないでください。 例: exampledir/exampleobject.txt。 */
    std::string ObjectName = "exampledir/exampleobject.txt";

    /* ネットワークリソースなどのリソースを初期化します。 */
    InitializeSdk();

    ClientConfiguration conf;
    /* 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 */
    auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
    OssClientクライアント (Endpoint, credentialsProvider, conf);

    auto meta = ObjectMetaData();
    meta.setContentType("text/plain");

    /* オブジェクトが初めて追加される場合は、追加操作の開始位置を0に設定します。 次の追加操作の位置は、応答に含まれる。 次の追加アップロードの開始位置は、オブジェクトの現在の長さです。 */
    std::shared_ptr<std::iostream> content1 = std::make_shared<std::stringstream>();
    * content1 <<"Aliyun Object Storage Serviceをご利用いただきありがとうございます!";
    AppendObjectRequestリクエスト (BucketName, ObjectName, content1, meta);
    request.setPosition(0L);

    /* 最初の追加操作を実行します。 */
    auto result = client.AppendObject (リクエスト);

    if (!result.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "AppendObject fail" <<
        ",code:" << result.error().Code() <<
        ",message:" << result.error().Message() <<
        ",requestId:" << result.error().RequestId() << std::endl;
        return -1;
    }

    std::shared_ptr<std::iostream> content2 = std::make_shared<std::stringstream>();
    * content2 <<"Aliyun Object Storage Serviceをご利用いただきありがとうございます!";
    auto position = result.result().Length();
    AppendObjectRequest appendObjectRequest(BucketName, ObjectName, content2);
    appendObjectRequest.setPosition(position);

    /* 2回目の追加操作を実行します。 */
    auto outcome = client.AppendObject(appendObjectRequest);

    if (!outcome.isSuccess()) {
        /* 例外を処理します。 */
        std::cout << "AppendObject fail" <<
        ",code:" << outcome.error().Code() <<
        ",message:" << outcome.error().Message() <<
        ",requestId:" << outcome.error().RequestId() << std::endl;
        return -1;
    }

    /* ネットワークリソースなどのリソースを解放します。 */
    ShutdownSdk();
    0を返します。} 
#include "oss_api.h"
# 「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 = "クラウドだけではありません。";
void init_options(oss_request_options_t * オプション)
{
    options->config = oss_config_create(options->pool);
    /* char * stringを使用して、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"));
    /* CNAMEを使用するかどうかを指定します。 値0は、CNAMEが使用されないことを示す。 */
    options->config->is_cname = 0;
    /* タイムアウト時間などのネットワークパラメーターを指定します。 */
    options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char * argv[])
{
    /* main() でaos_http_io_initializeメソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
    if (aos_http_io_initialize(NULL, 0))! =AOSE_OK) {
        exit(1);
    }
    /* メモリを管理するためのメモリプールを作成します。 aos_pool_tはapr_pool_tと同じです。 メモリプールの作成に使用されるコードは、APRライブラリに含まれています。 */
    aos_pool_t *pool;
    /* メモリプールを作成します。 2番目のパラメーターの値はNULLです。 この値は、プールが他のメモリプールを継承しないことを示します。 */
    aos_pool_create(&pool, NULL);
    /* Create and initialize options. このパラメーターには、エンドポイント、access_key_id、access_key_secret、is_cname、curlなどのグローバル構成情報が含まれます。 */
    oss_request_options_t *oss_client_options;
    /* メモリプール内のメモリリソースをオプションに割り当てます。 */
    oss_client_options = oss_request_options_create(pool);
    /* oss_client_optionsを初期化します。 */
    init_options(oss_client_options);
    /* パラメーターを初期化します。 */
    aos_string_t bucket;
    aos_string_t object;
    aos_list_t buffer;
    int64_t position = 0;
    char *next_append_position = NULL;
    aos_buf_t *content = NULL;
    aos_table_t *headers1 = NULL;
    aos_table_t *headers2 = NULL;
    aos_table_t *resp_headers = NULL; 
    aos_status_t *resp_status = NULL; 
    aos_str_set(&bucket, bucket_name);
    aos_str_set(&object, object_name);
    headers1 = aos_table_make(pool, 0);
    /* 最初の追加操作の開始位置を取得します。 */
    resp_status = oss_head_object(oss_client_options, &bucket, &object, headers1, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        next_append_position = (char*)(apr_table_get(resp_headers, "x-oss-next-append-position"));
        position = atoi(next_append_position);
    }
    /* 追加操作を実行します。 */
    headers2 = aos_table_make(pool, 0);
    aos_list_init(&buffer);
    content = aos_buf_pack(pool, object_content, strlen(object_content));
    aos_list_add_tail(&content->node, &buffer);
    resp_status = oss_append_object_from_buffer(oss_client_options, &bucket, &object, position, &buffer, headers2, &resp_headers);
    if (aos_status_is_ok(resp_status)) {
        printf("append object from buffer succeeded\n");
    } else {
        printf("append object from buffer failed\n");
    }
    /* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
    aos_pool_destroy(pool);
    /* 割り当てられたグローバルリソースを解放します。 */
    aos_http_io_deinitialize();
    0を返します。} 
'aliyun/oss' が必要です

client = Aliyun::OSS::Client.new (
  # この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
  エンドポイント: '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 ']
)

# バケットの名前を指定します。 例: examplebucket. 
bucket = client.get_bucket('examplebucket')
# my-objectをオブジェクトの完全パスに置き換えます。 バケット名をフルパスに含めないでください。 
bucket.append_object('my-object', 0)

# オブジェクトの末尾にコンテンツを追加します。 
next_pos = bucket.append_object('my-object', 0) do | stream |
  100.times { | i | stream << i.to_s}
終了
next_pos = bucket.append_object('my-object ', next_pos, :file => 'local-file-1')
next_pos = bucket.append_object('my-object ', next_pos, :file => 'local-file-2') 

ossutilの使用

ossutilを使用して追加アップロードを実行できます。 詳細については、「appendfromfile」をご参照ください。

OSS APIの使用

ビジネスで高度なカスタマイズが必要な場合は、RESTful APIを直接呼び出すことができます。 APIを直接呼び出すには、コードに署名計算を含める必要があります。 詳しくは、「AppendObject 」をご参照ください。

FAQ

追加アップロードにはファイルタイプの制限がありますか?

追加アップロードにはファイルタイプの制限はありません。 追加アップロードは、バイナリストリームを使用してデータを追加します。