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

Object Storage Service:オブジェクトの最終変更時刻またはEタグに基づいてオブジェクトをダウンロードする

最終更新日:Feb 22, 2024

object Storage Service (OSS) バケットからオブジェクトをダウンロードする場合、最終変更時刻またはオブジェクトのETagに基づいてダウンロード条件を指定できます。 指定されたダウンロード条件が満たされると、オブジェクトがダウンロードされます。 それ以外の場合、エラーが返され、オブジェクトはダウンロードされません。 これにより、同じオブジェクトを繰り返しダウンロードすることを回避して、ネットワークトラフィックとリソース使用量を削減し、ダウンロード効率を向上させることができます。

前提条件

  • オブジェクトがOSSにアップロードされます。 詳しくは、「オブジェクトのアップロード」をご参照ください。

  • アーカイブオブジェクトをダウンロードする場合は、アーカイブオブジェクトが復元されるか、アーカイブオブジェクトを格納するバケットに対してアーカイブオブジェクトのリアルタイムアクセスが有効になります。 詳細については、「オブジェクトの復元」および「アーカイブオブジェクトのリアルタイムアクセス」をご参照ください。

  • オブジェクトをダウンロードする場合は、Cold ArchiveオブジェクトまたはDeep Cold Archiveオブジェクトが復元されます。 詳細については、「オブジェクトの復元」をご参照ください。

  • RAMユーザーを使用して条件付きダウンロードを実行する場合は、RAMユーザーにoss:GetObject権限が付与されます。 詳細については、「RAMポリシーの一般的な例」をご参照ください。

シナリオ

  • アプリケーションリソースの更新: アプリケーションは、オブジェクトのETagが変更されたこと、またはオブジェクトの最後に変更された時刻が更新されたことを検出した場合にのみ、オブジェクトをダウンロードします。 これにより、データ使用量が最小限に抑えられ、ユーザーエクスペリエンスが最適化されます。

  • データ同期と増分バックアップ: ETagsが変更された、または最終変更時刻が更新されたオブジェクトのみが同期またはバックアップされます。 これにより、帯域幅コストが削減され、データの適時性と一貫性が保証されます。

  • オブジェクトの共有と同期: Etagsまたはオブジェクトの最終変更時刻を使用して、オブジェクトが変更されたかどうかを確認し、変更されたオブジェクトを同期できます。 これにより、作業のコラボレーションが加速され、データ消費が削減されます。

ダウンロード条件

利用可能なオブジェクトのダウンロード条件を次の表に示します。

ヘッダー

説明

If-Modified-Since

このヘッダーで指定された時刻がオブジェクトの最終変更時刻より前か無効な場合、オブジェクトと200 OKが返されます。 それ以外の場合、304 Not Modifiedが返されます。

時刻はGMTである必要があります。 例: 金曜日、11月2015日14:47:53 GMT

デフォルトでは、このヘッダーは空のままです。

If-Unmodified-Since

このヘッダーで指定された時間がオブジェクトの最後に変更された時間と同じかそれ以降の場合、オブジェクトと200 OKが返されます。 そうでない場合、412 Precondition Failedが返されます。

時刻はGMTである必要があります。 例: 金曜日、11月2015日14:47:53 GMT

リクエストでは、If-Modified-SinceヘッダーとIf-Unmodified-Sinceヘッダーの両方を指定できます。

デフォルトでは、このヘッダーは空のままです。

If-Match

このヘッダーで指定されたETagがオブジェクトのETagと一致する場合、オブジェクトと200 OKが返されます。 そうでない場合、412 Precondition Failedが返されます。

オブジェクトのETagは、オブジェクトのデータ整合性をチェックするために使用されます。

デフォルトでは、このヘッダーは空のままです。

If-None-マッチ

このヘッダーで指定されたETagがオブジェクトのETagと一致しない場合、オブジェクトと200 OKが返されます。 それ以外の場合、304 Not Modifiedが返されます。

リクエストでは、If-MatchヘッダーとIf-None-Matchヘッダーの両方を指定できます。

デフォルトでは、このヘッダーは空のままです。

重要

OSSコンソールまたはossutilを使用して条件付きダウンロードを実行することはできません。

手順

OSS SDKの使用

次のサンプルコードは、一般的なプログラミング言語でOSS SDKを使用してGetObjectを呼び出す条件付きダウンロードを実行する方法の例を示しています。 他のプログラミング言語でOSS SDKを使用して条件付きダウンロードを実行する方法の詳細については、「概要」をご参照ください。

Java

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.GetObjectRequestをインポートします。java.io. ファイルをインポートします。java.util.Dateをインポートします。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";
        // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: testfolder/exampleobject.txt。 
        文字列objectName = "testfolder/exampleobject.txt";
        文字列pathName = "D :\\ localpath\\examplefile.txt";

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

        try {
            GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
            // たとえば、オブジェクトは2023年9月26日13:27:04に最後に変更されました。 指定された時刻が前回の変更時刻より前の場合 (9月25日火曜日13:27,04 CST 2023など) 、オブジェクトはIf-modified-Since条件を満たし、オブジェクトがダウンロードされます。 
            request.setModifiedSinceConstraint (新しい日付 (「9月25日火曜日13:27,04 CST 2023」));

            // オブジェクトをローカルデバイスにダウンロードします。 
            ossClient.getObject(request, new File(pathName));
        } 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

<?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_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数を指定していることを確認してください。  
$accessKeyId = getenv("OSS_ACCESS_KEY_ID");
$accessKeySecret = getenv("OSS_ACCESS_KEY_SECRET");
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
$end point = "http://oss-cn-hangzhou.aliyuncs.com";
// バケットの名前を指定します。 
$bucket= "<yourBucketName>";
// オブジェクト名を指定します。 オブジェクト名は、オブジェクトの完全なパスです。 オブジェクトのパスにバケット名を含めることはできません。 例: exampledir/exampleobject.txt。 
$object = "<yourObjectName>";
// アップロードするローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 
$localfile = "<yourLocalFile>";

try {
    $options = array(
        OssClient::OSS_HEADERS => array(          
           // If-Modified-を設定する4月9日金曜日14:47:53 GMTで2021。 
          OssClient::OSS_IF_MODIFIED_SINCE => 「金曜日、2021年4月9日14:47:53 GMT」、
          // If-Unmodified-を設定する14:47:53 10月13日水曜日、2021 GMTで。 
          OssClient::OSS_IF_UNMODIFIED_SINCE => 「10月13日金曜日2021: 47:53 GMT」、
          // ETag値がリクエストで指定されたETag値と一致しないオブジェクトをダウンロードするように指定します。 
          OssClient::OSS_IF_NONE_MATCH => '"5B3C1A2E0563E1B002CC607C ****"' 、
          // ETag値がリクエストで指定されたETag値と一致するオブジェクトをダウンロードするように指定します。 
          OssClient::OSS_IF_MATCH => '"fba9dede5f27731c9771645a3986 ****"' 、          
          OssClient::OSS_FILE_DOWNLOAD => $localfile
        )

    );

    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
    $ossClient->getObject($bucket、$object、$options);
} catch(OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage()) 。 "\n");
    戻ります。} 

Node.js

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、
  // バケットの名前を指定します。 
  bucket: 'examplebucket'
});

async関数main() {
  try {
    // exampleobject.txtという名前のオブジェクトをアップロードします。 
    wait client.put("exampleobject.txt" 、Buffer.from("contenttest"));
    // リクエストにIf-Modified-Sinceヘッダーを設定します。 このヘッダーの値が、アップロードされたオブジェクトが最後に変更された時刻より前の場合、オブジェクトがダウンロードされます。 
    let result = await client.get("exampleobject.txt", {
      ヘッダー:{
        "If-Modified-Since": new Date("1970-01-01").toGMTString(),
      },
    });
    console.log(result.content.toString() === "contenttest");
    console.log(result.res.status === 200);

    // If-Modified-Sinceヘッダーの値が、アップロードされたオブジェクトが最後に変更された時刻と同じかそれ以降の場合、OSSはNot modified 304を返します。 
    result = await client.get("exampleobject.txt", {
      ヘッダー:{
        "If-Modified-Since": new Date().toGMTString(),
      },
    });
    console.log(result.content.toString() === "");
    console.log(result.res.status === 304);
  } catch (e) {
    console.log(e.code === "Not Modified");
  }
}

メイン (); 

Python

oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート

# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
# バケットの名前を指定します。 例: examplebucket. 
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 オブジェクトの命名規則の詳細については、「オブジェクトの命名規則」をご参照ください。 
object_name = 'exampledir/exampleobject.txt'

headers = dict()
# リクエストで指定された時刻がオブジェクトの実際の変更時刻より前の場合、オブジェクトはダウンロードされます。 それ以外の場合、エラーコード「304 Not modified」が返されます。 
headers['If-Modified-Since'] = 'Mon, 13 Dec 2021 14:47:53 GMT'
# リクエストで指定された時刻がオブジェクトの実際の変更時刻と同じかそれ以降の場合、オブジェクトはダウンロードされます。 それ以外の場合、Precondition failed 412エラーコードが返されます。 
# headers['If-Unmodified-Since'] = 'Mon, 13 Dec 2021 14:47:53 GMT'
# リクエストで指定されたETag値がオブジェクトのETag値と一致する場合、オブジェクトがダウンロードされます。 それ以外の場合、エラーコード「412前提条件失敗」が返されます。 
# headers['If-Match'] = 'DC21493F505BA3739562D8CC452C ****'
# リクエストで指定されたETag値がオブジェクトのETag値と一致しない場合、オブジェクトはダウンロードされます。 それ以外の場合、エラーコード「304 Not modified」が返されます。 
# headers['If-None-Match'] = 'DC21493F505BA3739562D8CC452C ****'
object_stream = bucket.get_object(object_name, headers=headers)
プリント (object_stream.read()) 

Browser.js

<!DOCTYPE html>
<html lang="en">

<ヘッド>
  <meta charset="UTF-8" />
  <title> ドキュメント </title>
</head>

<body>
  <button id='upload'> アップロード </button>
  <button id='download'> ダウンロード </button>
    <!-- SDKファイルのインポート->
  <script type="text/javascript" src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"></script>
  <script type="text/javascript">
      const client = new OSS({
         // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 
         リージョン: 'yourRegion' 、
         // STSから取得した一時的なAccessKeyペアを指定します。 AccessKeyペアは、AccessKey IDとAccessKeyシークレットで構成されます。 
         accessKeyId: 'yourAccessKeyId' 、
         accessKeySecret: 'yourAccessKeySecret' 、
         // STSから取得したセキュリティトークンを指定します。 
        stsToken: 'yourSecurityToken' 、
        // バケットの名前を指定します。 例: examplebucket. 
        bucket: "examplebucket" 、
      });

    const download = document.getElementById('download')
    const upload = document.getElementById('upload')

    // Upload the object.   
    upload.addEventListener('click', () => {
      // アップロードするオブジェクトのコンテンツを指定します。 
      const file = new Blob(['examplectent'])
      // オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 
      const fileName = 'exampledir/exampleobject.txt'
      const result = client.put(fileName, file).then(r => console.log(r))
    })

    // Download the object. 
    addEventListener('click', () => {
      // ダウンロードするオブジェクトのデータ範囲を指定します。 
      const start = 1, end = 5
      client.get('exampledir/exampleobject.txt ', {
        ヘッダー:{
          // リクエストにIf-Modified-Sinceヘッダーを設定します。 このヘッダーの値が、アップロードされたオブジェクトが最後に変更された時刻より前の場合、オブジェクトがダウンロードされます。 // If-Modified-Sinceヘッダーの値が、アップロードされたオブジェクトが最後に変更された時刻と同じかそれ以降の場合、OSSはNot modified 304を返します。 
          "If-Modified-Since": new Date("1970-01-01").toGMTString()
          // リクエストにIf-Unmodified-Sinceヘッダーを設定します。 このヘッダーの値が、アップロードされたオブジェクトが最後に変更された時刻と同じかそれ以降の場合、オブジェクトはダウンロードされます。 If-Unmodified-Sinceヘッダーの値が、アップロードされたオブジェクトが最後に変更された時刻よりも前の場合、OSSは412 Precondition Failedを返します。 
          // "If-Unmodified-Since": new Date(1970-01-01).toGMTString()
          // If-MatchヘッダーをETag値に設定します。 指定されたETag値がオブジェクトのETagと一致する場合、オブジェクトがダウンロードされます。 指定されたETag値がオブジェクトのETagと一致しない場合、OSSは412 Precondition Failedを返します。 
          // "If-Match": '5B3C1A2E0563E1B002CC607C ****'
          // If-MatchヘッダーをETag値に設定します。 指定されたETag値がオブジェクトのETagと一致しない場合、オブジェクトはダウンロードされます。 指定されたETag値がオブジェクトのETagと一致する場合、OSSは304 Not Modifiedを返します。 
          // "If-None-Match": '5B3C1A2E0563E1B002CC607C ****'
        },
      }).then(r => {
        if (r.content.length > 0) {                
          const newBlob = new Blob([r.content], { type: r.res.headers['content-type'] });
          const link = document.createElement('a')
          link.href = window.URL.createObjectURL(newBlob)
          link.download = 'foo.txt'
          link.click()
          window.URL.revokeObjectURL(link.href)
        } else {
          console.log ('Error code', r.res.status)
          console.log (「ダウンロード対象オブジェクトなし」)
        }
      })
    })

  </script>
</body>

</html> 

Android

public void testGetObjectWithHeaders() が例外をスロー {
        // オブジェクトのダウンロード要求を作成します。 
        // examplebucketなどのバケット名と、exampledir/exampleobject.txtなどのオブジェクトの完全パスを指定します。 フルパスにバケット名を含めることはできません。 
        GetObjectRequest request = new GetObjectRequest("examplebucket", "exampledir/exampleobject.txt");
        request.setRequestHeaders(...);


        OSSAsyncTask task = oss.asyncGetObject(request, getCallback);
        task.waitUntilFinished();

        GetObjectRequest rq = getCallback.request;
        GetObjectResult result = getCallback.result;

    }

Go

パッケージメイン

import (import (import)
    "fmt"
    "os"
    "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 {
        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)
    }

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

    // たとえば、オブジェクトは2023年11月21日18:43:02に最後に変更されました。 指定された時刻が最後に変更された時刻より前の場合、オブジェクトはIf-modified-Since条件を満たし、オブジェクトがダウンロードされます。 
    date := time.Date(2023, time.November, 21, 10, 40, 02, 0, time.UTC)

    // 指定された条件を満たさないオブジェクトはダウンロードされません。 
    // オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 
    err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfUnmodifiedSince(date))    
    if err == nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 指定された条件を満たす場合、オブジェクトがダウンロードされます。 
    err = bucket.GetObjectToFile("yourObjectName", "LocalFile", oss.IfModifiedSince(date))
    if err! =nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
}

iOS

OSSGetObjectRequest * get = [OSSGetObjectRequest new];
// バケット名を指定します。 バケットの命名規則の詳細については、「バケットの命名規則」をご参照ください。 
get.bucketName = @ "examplebucket";
// オブジェクトのフルパスを指定します。 パスにバケット名を含めることはできません。 オブジェクトの命名規則の詳細については、「オブジェクトの命名規則」をご参照ください。 
get.objectKey = @ "exampledir/exampleobject.txt";
NSMutableDictionary * headerFields = [NSMutableDictionary];
// GMTで10月13日金曜日2021日14:47:53以降に変更されたオブジェクトをダウンロードするように指定します。 
[headerFields setValue:@ "Fri, 13 Oct 2021 14:47:53 GMT" forKey:@ "If-Modified-Since"];
// 現在の時刻またはそれ以前に変更されたオブジェクトがダウンロードされることを指定します。 
[headerFields setValue:[[NSDate new] oss_asStringValue] forKey:@ "If-Unmodified-Since"];
// ETag値がリクエストで指定されたETag値と一致しないオブジェクトをダウンロードするように指定します。 
[headerFields setValue:@ "5B3C1A2E0563E1B002CC607C ****" forKey:@ "If-None-Match"];
// ETag値がリクエストで指定されたETag値と一致するオブジェクトをダウンロードするように指定します。 
[headerFields setValue:@ "fba9dede5f27731c9771645a3986 ****" forKey:@ "If-Match"];
get.headerFields = headerFields;

[[[_client getObject:get] continueWithBlock:^ id _Nullable(OSSTask * _Nonnullタスク)) {
    if (!task.error) {
        NSLog(@ "get object success!");
    } else {
        NSLog(@ "get object error: % @" 、task.error);
    }
    nilを返します。}] waitUntilFinished]; 

OSS APIの使用

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

参考資料

  • バージョン管理が有効なバケットからオブジェクトをダウンロードする方法の詳細については、「バージョン管理が有効なバケット内のオブジェクトの管理」をご参照ください。

  • バージョン管理が中断されたバケットからオブジェクトをダウンロードする方法の詳細については、「バージョン管理が中断されたバケット内のオブジェクトの管理」をご参照ください。

  • OSSでは、バケットとオブジェクトのアクセス制御リスト (ACL) を設定できます。 このように、権限のないサードパーティユーザーはバケットからデータをダウンロードできません。 詳細については、「概要」をご参照ください。

  • バケットから直接オブジェクトをダウンロードする場合は、簡単なダウンロードを実行できます。 詳細については、「簡易ダウンロード」をご参照ください。

  • 大きなオブジェクトをダウンロードするときに中断されたダウンロードタスクを中断したところから続行する場合は、再開可能なダウンロードを使用できます。 詳細については、「再開可能なダウンロード」をご参照ください。

  • ACLが非公開のバケットからオブジェクトをダウンロードする権限をサードパーティのユーザーに付与する場合は、Security Token Service (STS) を使用して一時的なアクセス資格情報を生成するか、署名付きURLを使用します。 詳細については、「サードパーティユーザーにオブジェクトのダウンロードを許可する」をご参照ください。