全部产品
Search
文档中心

Object Storage Service:Unduh objek berdasarkan waktu terakhir dimodifikasi atau ETags objek

更新时间:Jul 06, 2025

Saat mengunduh objek dari bucket Object Storage Service (OSS), Anda dapat menentukan kondisi berdasarkan waktu terakhir dimodifikasi atau ETag objek. Jika kondisi terpenuhi, objek akan diunduh; jika tidak, kesalahan akan dikembalikan dan objek tidak diunduh. Pendekatan ini membantu menghindari pengunduhan objek yang sama berulang kali, mengurangi lalu lintas jaringan, serta meningkatkan efisiensi unduhan.

Prasyarat

  • Objek telah diunggah ke OSS. Untuk informasi lebih lanjut, lihat Unggah objek.

  • Untuk objek Arsip, pastikan objek telah dipulihkan atau akses real-time untuk objek Arsip diaktifkan pada bucket penyimpanan. Untuk informasi lebih lanjut, lihat Pulihkan objek dan Akses real-time objek Arsip.

  • Untuk objek Cold Archive atau Deep Cold Archive, pastikan objek telah dipulihkan sebelum diunduh. Untuk informasi lebih lanjut, lihat Pulihkan objek.

  • Izin oss:GetObject harus diberikan kepada Pengguna Resource Access Management (RAM) jika menggunakan pengguna RAM untuk melakukan unduhan bersyarat. Untuk informasi lebih lanjut, lihat Contoh umum kebijakan RAM.

Skenario

  • Pembaruan sumber daya aplikasi: Aplikasi hanya mengunduh objek ketika mendeteksi bahwa ETag objek telah berubah atau waktu terakhir dimodifikasi objek diperbarui. Hal ini meminimalkan konsumsi data dan mengoptimalkan pengalaman pengguna.

  • Sinkronisasi data dan cadangan tambahan: Hanya objek dengan ETag yang berubah atau waktu terakhir dimodifikasi yang diperbarui yang disinkronkan atau dicadangkan. Ini mengurangi biaya bandwidth dan memastikan ketepatan waktu serta konsistensi data.

  • Berbagi dan sinkronisasi objek: Gunakan ETag atau waktu terakhir dimodifikasi objek untuk memverifikasi apakah objek telah berubah, kemudian sinkronkan objek yang berubah. Pendekatan ini mempercepat kolaborasi kerja dan mengurangi konsumsi data.

Kondisi Unduhan

Tabel berikut menjelaskan kondisi unduhan objek yang tersedia.

Header

Deskripsi

If-Modified-Since

Jika waktu yang ditentukan dalam header ini lebih awal dari waktu terakhir dimodifikasi objek atau tidak valid, objek dan 200 OK dikembalikan. Jika tidak, 304 Not Modified dikembalikan.

Waktu harus dalam GMT. Contoh: Fri, 13 Nov 2015 14:47:53 GMT.

Secara default, header ini dibiarkan kosong.

If-Unmodified-Since

Jika waktu yang ditentukan dalam header ini sama dengan atau lebih baru dari waktu terakhir dimodifikasi objek, objek dan 200 OK dikembalikan. Jika tidak, 412 Precondition Failed dikembalikan.

Waktu harus dalam GMT. Contoh: Fri, 13 Nov 2015 14:47:53 GMT.

Anda dapat menentukan header If-Modified-Since dan If-Unmodified-Since dalam satu permintaan.

Secara default, header ini dibiarkan kosong.

If-Match

Jika ETag yang ditentukan dalam header ini cocok dengan ETag objek, objek dan 200 OK dikembalikan. Jika tidak, 412 Precondition Failed dikembalikan.

ETag objek digunakan untuk memeriksa integritas data objek.

Secara default, header ini dibiarkan kosong.

If-None-Match

Jika ETag yang ditentukan dalam header ini tidak cocok dengan ETag objek, objek dan 200 OK dikembalikan. Jika tidak, 304 Not Modified dikembalikan.

Anda dapat menentukan header If-Match dan If-None-Match dalam satu permintaan.

Secara default, header ini dibiarkan kosong.

Penting

Anda tidak dapat melakukan unduhan bersyarat menggunakan konsol OSS atau ossutil.

Prosedur

Gunakan SDK OSS

Kode contoh berikut menunjukkan cara melakukan unduhan bersyarat menggunakan OSS SDK untuk bahasa pemrograman umum dengan memanggil GetObject. Untuk informasi lebih lanjut tentang cara melakukan unduhan bersyarat menggunakan OSS SDK untuk bahasa pemrograman lainnya, lihat Ikhtisar.

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GetObjectRequest;
import java.io.File;
import java.util.Date;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Tentukan endpoint aktual Anda.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Tentukan nama bucket. Contoh: examplebucket.
        String bucketName = "examplebucket";
        // Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: testfolder/exampleobject.txt.
        String objectName = "testfolder/exampleobject.txt";
        String pathName = "D:\\localpath\\examplefile.txt";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Panggil metode shutdown untuk melepaskan sumber daya terkait saat OSSClient tidak lagi digunakan.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);        
        OSS ossClient = OSSClientBuilder.create()
        .endpoint(endpoint)
        .credentialsProvider(credentialsProvider)
        .clientConfiguration(clientBuilderConfiguration)
        .region(region)               
        .build();

        try {
            GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
            // Misalnya, sebuah objek terakhir dimodifikasi pada pukul 13:27:04, 26 September 2023. Jika waktu yang ditentukan lebih awal dari waktu terakhir dimodifikasi, seperti Tue Sep 25 13:27:04 CST 2023, objek memenuhi kondisi If-Modified-Since dan objek diunduh.
            request.setModifiedSinceConstraint(new Date("Tue Sep 25 13:27:04 CST 2023"));

            // Unduh objek ke perangkat lokal Anda.
            ossClient.getObject(request, new File(pathName));
        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena alasan tertentu.");
            System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
            System.out.println("Kode Kesalahan:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("ID Host:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Tangkap ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}
        

PHP

<?php

// Sertakan file autoload agar dependensi yang diperlukan dapat dimuat.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Definisikan dan jelaskan argumen baris perintah.
$optsdesc = [
    "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // (Diperlukan) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // (Opsional) Tentukan endpoint.
    "bucket" => ['help' => 'Nama bucket', 'required' => True], // (Diperlukan) Tentukan nama bucket.
    "key" => ['help' => 'Nama objek', 'required' => True], // (Diperlukan) Tentukan nama objek.
];

// Ubah deskripsi parameter menjadi daftar opsi panjang yang diperlukan oleh getopt.
// Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

// Parsing argumen baris perintah.
$options = getopt("", $longopts);

// Periksa apakah argumen yang diperlukan hilang.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan untuk parameter.
        echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL;
        exit(1); // Keluar dari program jika parameter yang diperlukan tidak dikonfigurasi.
    }
}

// Ekstrak argumen yang diuraikan dan gunakan.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"];       // Nama objek.

// Muat kredensial akses dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk mengambil ID AccessKey dan Rahasia AccessKey dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Setel penyedia kredensial.
$cfg->setRegion($region); // Setel wilayah tempat bucket berada.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // Jika endpoint diberikan, setel endpoint.
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Jika waktu terakhir dimodifikasi objek adalah 21 Oktober 2024 18:43:02, dan waktu UTC yang ditentukan lebih awal dari waktu ini, kondisi IfModifiedSince terpenuhi dan operasi unduhan dipicu.
$ifModifiedSince = "Sun, 21 Oct 2024 18:43:02 GMT";

// Jika ETag objek adalah e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, dan ETag yang ditentukan sama dengan nilai ini, kondisi IfMatch terpenuhi dan operasi unduhan dipicu.
$etag = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";

// Buat objek GetObjectRequest untuk mendapatkan konten objek yang ditentukan.
$request = new Oss\Models\GetObjectRequest(
            bucket: $bucket,
            key: $key,
            ifModifiedSince: $ifModifiedSince,
            ifMatch: $etag);

// Kueri objek.
$result = $client->getObject($request);

// Tampilkan hasilnya.
// Keluarkan kode status HTTP, ID permintaan, dan konten objek.
printf(
    'kode status:' . $result->statusCode . PHP_EOL . // Kode status HTTP, seperti 200 untuk sukses.
    'id permintaan:' . $result->requestId . PHP_EOL . // ID permintaan untuk debugging atau melacak permintaan.
    'konten objek:' . $result->body->getContents() . PHP_EOL // Konten objek.
);

Node.js

const OSS = require('ali-oss');

const client = new OSS({
  // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
  region: 'yourRegion',
  // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan Anda telah mengonfigurasi variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET.
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  // Tentukan nama bucket.
  bucket: 'examplebucket'
});

async function main() {
  try {
    // Unggah objek bernama exampleobject.txt.
    await client.put("exampleobject.txt", Buffer.from("contenttest"));
    // Setel header If-Modified-Since dalam permintaan. Jika nilai header ini lebih awal dari waktu terakhir dimodifikasi objek yang diunggah, objek diunduh.
    let result = await client.get("exampleobject.txt", {
      headers: {
        "If-Modified-Since": new Date("1970-01-01").toGMTString(),
      },
    });
    console.log(result.content.toString() === "contenttest");
    console.log(result.res.status === 200);

    // Jika nilai header If-Modified-Since sama dengan atau lebih baru dari waktu terakhir dimodifikasi objek yang diunggah, OSS mengembalikan 304 Not Modified.
    result = await client.get("exampleobject.txt", {
      headers: {
        "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");
  }
}

main();

Python

import argparse
import alibabacloud_oss_v2 as oss
from datetime import datetime, timezone

# Buat parser argumen baris perintah dan jelaskan tujuan skrip: dapatkan objek dan simpan ke sampel file
parser = argparse.ArgumentParser(description="dapatkan objek ke sampel file")

# Tentukan parameter --region, yang menentukan wilayah tempat bucket berada. Parameter ini diperlukan.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini diperlukan.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint, yang menentukan endpoint yang dapat digunakan layanan lain untuk mengakses OSS. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key, yang menentukan nama objek. Parameter ini diperlukan.
parser.add_argument('--key', help='Nama objek.', required=True)
# Tentukan parameter --file_path, yang menentukan jalur lokal untuk menyimpan konten yang diunduh. Parameter ini diperlukan.
parser.add_argument('--file_path', help='Jalur file untuk menyimpan konten yang diunduh.', required=True)

def main():
    # Parsing parameter baris perintah untuk mendapatkan nilai yang ditentukan
    args = parser.parse_args()

    # Dari variabel lingkungan, muat informasi autentikasi yang diperlukan untuk mengakses OSS.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Gunakan konfigurasi default untuk membuat objek konfigurasi dan tentukan penyedia kredensial
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    
    # Tentukan atribut wilayah objek konfigurasi berdasarkan parameter baris perintah yang ditentukan pengguna
    cfg.region = args.region

    # Jika endpoint kustom diberikan, perbarui atribut endpoint objek cfg dengan endpoint yang diberikan
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan konfigurasi sebelumnya untuk menginisialisasi instance OSSClient
    client = oss.Client(cfg)

    # Definisikan waktu if_modified_since
    # Hanya objek yang dimodifikasi setelah waktu ini yang akan dikembalikan
    if_modified_since = datetime(2024, 10, 1, 12, 0, 0, tzinfo=timezone.utc)

    # Anggaplah ETag adalah DA5223EFCD7E0353BE08866700000000, jika ETag yang ditentukan sama dengan ETag objek, kondisi IfMatch terpenuhi dan unduhan dipicu.
    etag = "\"DA5223EFCD7E0353BE08866700000000\""

    # Jalankan permintaan untuk mendapatkan objek dan simpan ke file lokal
    result = client.get_object_to_file(
        oss.GetObjectRequest(
            bucket=args.bucket,  # Tentukan nama bucket
            key=args.key,        # Tentukan kunci objek
            if_modified_since=if_modified_since,  # Hanya objek yang dimodifikasi setelah waktu yang ditentukan yang akan dikembalikan
            if_match=etag,       # Hanya objek dengan ETag yang cocok yang akan dikembalikan
        ),
        args.file_path  # Tentukan jalur lokal untuk menyimpan file yang diunduh
    )

    # Tampilkan informasi respons, termasuk kode status, ID permintaan, dll.
    print(f'kode status: {result.status_code},'
          f' id permintaan: {result.request_id},'
          f' panjang konten: {result.content_length},'
          f' rentang konten: {result.content_range},'
          f' tipe konten: {result.content_type},'
          f' etag: {result.etag},'
          f' terakhir dimodifikasi: {result.last_modified},'
          f' md5 konten: {result.content_md5},'
          f' kontrol cache: {result.cache_control},'
          f' disposisi konten: {result.content_disposition},'
          f' enkode konten: {result.content_encoding},'
          f' kedaluwarsa: {result.expires},'
          f' hash crc64: {result.hash_crc64},'
          f' kelas penyimpanan: {result.storage_class},'
          f' tipe objek: {result.object_type},'
          f' id versi: {result.version_id},'
          f' jumlah penandaan: {result.tagging_count},'
          f' enkripsi sisi server: {result.server_side_encryption},'
          f' enkripsi data sisi server: {result.server_side_data_encryption},'
          f' posisi lampiran berikutnya: {result.next_append_position},'
          f' kedaluwarsa: {result.expiration},'
          f' pulihkan: {result.restore},'
          f' status proses: {result.process_status},'
          f' penanda hapus: {result.delete_marker},'
          f' waktu server: {result.headers.get("x-oss-server-time")},'
    )

# Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan langsung
if __name__ == "__main__":
    main()  # Titik masuk skrip, alur program dimulai di sini

Browser.js

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

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
</head>

<body>
  <button id='upload'>Unggah</button>
  <button id='download'>Unduh</button>
    <!-- Impor file 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({
         // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke oss-cn-hangzhou.
         region: 'yourRegion',
         authorizationV4: true,
         // Tentukan pasangan AccessKey sementara yang diperoleh dari STS. Pasangan AccessKey terdiri dari ID AccessKey dan Rahasia AccessKey.
         accessKeyId: 'yourAccessKeyId',
         accessKeySecret: 'yourAccessKeySecret',
         // Tentukan token keamanan yang Anda peroleh dari STS.
        stsToken: 'yourSecurityToken',
        // Tentukan nama bucket. Contoh: examplebucket.
        bucket: "examplebucket",
      });

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

    // Unggah objek.
    upload.addEventListener('click', () => {
      // Tentukan konten objek yang akan diunggah.
      const file = new Blob(['examplecontent'])
      // Tentukan jalur lengkap objek. Contoh: exampledir/exampleobject.txt.
      const fileName = 'exampledir/exampleobject.txt'
      const result = client.put(fileName, file).then(r => console.log(r))
    })

    // Unduh objek.
    download.addEventListener('click', () => {
      // Tentukan rentang data objek yang akan diunduh.
      const start = 1, end = 5
      client.get('exampledir/exampleobject.txt', {
        headers: {
          // Setel header If-Modified-Since dalam permintaan. Jika nilai header ini lebih awal dari waktu terakhir dimodifikasi objek yang diunggah, objek diunduh. // Jika nilai header If-Modified-Since sama dengan atau lebih baru dari waktu terakhir dimodifikasi objek yang diunggah, OSS mengembalikan 304 Not Modified.
          "If-Modified-Since": new Date("1970-01-01").toGMTString()
          // Setel header If-Unmodified-Since dalam permintaan. Jika nilai header ini sama dengan atau lebih baru dari waktu terakhir dimodifikasi objek yang diunggah, objek diunduh. Jika nilai header If-Unmodified-Since lebih awal dari waktu terakhir dimodifikasi objek yang diunggah, OSS mengembalikan 412 Precondition Failed.
          //"If-Unmodified-Since": new Date(1970-01-01).toGMTString()
          // Setel header If-Match ke nilai ETag. Jika nilai ETag yang ditentukan cocok dengan ETag objek, objek diunduh. Jika nilai ETag yang ditentukan tidak cocok dengan ETag objek, OSS mengembalikan 412 Precondition Failed.
          //"If-Match": '5B3C1A2E0563E1B002CC607C****'
          // Setel header If-Match ke nilai ETag. Jika nilai ETag yang ditentukan tidak cocok dengan ETag objek, objek diunduh. Jika nilai ETag yang ditentukan cocok dengan ETag objek, OSS mengembalikan 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 ('Kode kesalahan', r.res.status)
          console.log ('Tidak ada objek yang memenuhi syarat untuk diunduh')
        }
      })
    })

  </script>
</body>

</html>

Android

// Tentukan nama bucket dan jalur lengkap objek. Dalam contoh ini, nama bucket adalah examplebucket dan jalur lengkap objek adalah exampledir/exampleobject.txt.
// Jangan sertakan nama bucket dalam jalur lengkap objek.
String bucketName = "examplebucket";
String objectKey = "exampledir/exampleobject.txt";
// Konstruksi permintaan untuk mengunduh objek.
Map<String, String> headers = new HashMap<>();
// Jika waktu yang ditentukan lebih awal dari waktu terakhir objek dimodifikasi, objek dapat diunduh. Jika tidak, 304 Not modified dikembalikan.
headers.put(OSSHeaders.GET_OBJECT_IF_MODIFIED_SINCE, "Fri, 13 Nov 2015 14:47:53 GMT");
// Jika waktu yang ditentukan lebih baru atau sama dengan waktu terakhir objek dimodifikasi, objek dapat diunduh. Jika tidak, 412 Precondition failed dikembalikan.
// headers.put(OSSHeaders.GET_OBJECT_IF_UNMODIFIED_SINCE, "Fri, 13 Nov 2015 14:47:53 GMT");
// Jika ETag yang ditentukan cocok dengan ETag objek, objek dapat diunduh. Jika tidak, 412 Precondition failed dikembalikan.
// headers.put(OSSHeaders.GET_OBJECT_IF_MATCH, "5B3C1A2E0563E1B002CC607C*****");
// Jika ETag yang ditentukan tidak cocok dengan ETag objek, objek dapat diunduh. Jika tidak, 304 Not modified dikembalikan.
// headers.put(OSSHeaders.GET_OBJECT_IF_NONE_MATCH, "5B3C1A2E0563E1B002CC607C*****");
GetObjectRequest get = new GetObjectRequest(bucketName, objectKey);
get.setRequestHeaders(headers);

OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() {
    @Override
    public void onSuccess(GetObjectRequest request, GetObjectResult result) {
        // Permintaan berhasil.
        InputStream inputStream = result.getObjectContent();
        byte[] buffer = new byte[2048];
        int len;
        try {
            while ((len = inputStream.read(buffer)) != -1) {
                // Proses data yang diunduh.
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // Tangani pengecualian permintaan.
        if (clientExcepion != null) {
            // Tangani pengecualian klien, seperti pengecualian jaringan.
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // Tangani pengecualian layanan.
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage, serviceException.getRawMessage());
        }
    }
});

Go

package main

import (
	"context"
	"flag"
	"log"
	"net/http"
	"time"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// Tentukan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Gunakan fungsi init untuk menginisialisasi parameter.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter.
	flag.Parse()

	// Periksa apakah nama bucket kosong.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket diperlukan")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah diperlukan")
	}

	// Periksa apakah nama objek kosong.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek diperlukan")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Tentukan jalur file lokal.
	localFile := "download.file"

	// Misalnya, sebuah objek terakhir dimodifikasi pada pukul 18:43:02, 21 November 2023. Jika waktu yang ditentukan dalam kondisi IfModifiedSince lebih awal dari waktu terakhir dimodifikasi, objek diunduh.
	date := time.Date(2024, time.October, 21, 18, 43, 2, 0, time.UTC)

	// Anggaplah ETag objek adalah e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855. Jika ETag yang ditentukan dalam kondisi IfMatch cocok dengan ETag objek, objek diunduh.
	etag := "\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\""

	// Buat permintaan untuk mengunduh objek.
	getRequest := &oss.GetObjectRequest{
		Bucket:          oss.Ptr(bucketName),                   // Nama bucket.
		Key:             oss.Ptr(objectName),                   // Nama objek.
		IfModifiedSince: oss.Ptr(date.Format(http.TimeFormat)), // Tentukan kondisi IfModifiedSince.
		IfMatch:         oss.Ptr(etag),                         // Tentukan kondisi IfMatch.
	}

	// Unduh objek ke perangkat lokal dan proses hasilnya.
	result, err := client.GetObjectToFile(context.TODO(), getRequest, localFile)
	if err != nil {
		log.Fatalf("gagal mendapatkan objek ke file %v", err)
	}

	log.Printf("hasil mendapatkan objek ke file:%#v\n", result)
}

iOS

OSSGetObjectRequest *get = [OSSGetObjectRequest new];
// Tentukan nama bucket. Untuk informasi lebih lanjut tentang konvensi penamaan bucket, lihat Konvensi Penamaan Bucket.
get.bucketName = @"examplebucket";
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap objek. Untuk informasi lebih lanjut tentang konvensi penamaan objek, lihat Konvensi Penamaan Objek.
get.objectKey = @"exampledir/exampleobject.txt";
NSMutableDictionary *headerFields = [NSMutableDictionary dictionary];
// Setel If-Modified-Since ke Fri, 13 Oct 2021 14:47:53 GMT.
[headerFields setValue:@"Fri, 13 Oct 2021 14:47:53 GMT" forKey:@"If-Modified-Since"];
// Tentukan bahwa objek hanya diunduh jika waktu terakhir dimodifikasinya adalah waktu yang ditentukan atau lebih awal.
[headerFields setValue:[[NSDate new] oss_asStringValue] forKey:@"If-Unmodified-Since"];
// Tentukan bahwa objek hanya diunduh jika tag entitas (ETag)-nya bukan ETag yang ditentukan.
[headerFields setValue:@"5B3C1A2E0563E1B002CC607C****" forKey:@"If-None-Match"];
// Tentukan bahwa objek hanya diunduh jika ETag-nya sama dengan ETag yang ditentukan.
[headerFields setValue:@"fba9dede5f27731c9771645a3986****" forKey:@"If-Match"];
get.headerFields = headerFields;

[[[client getObject:get] continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
    if (!task.error) {
        NSLog(@"mendapatkan objek berhasil!");
    } else {
        NSLog(@"kesalahan mendapatkan objek: %@", task.error);
    }
    return nil;
}] waitUntilFinished];

Gunakan API OSS

Jika bisnis Anda memerlukan tingkat penyesuaian yang tinggi, Anda dapat langsung memanggil API RESTful. Untuk memanggil API secara langsung, Anda harus menyertakan perhitungan tanda tangan dalam kode Anda. Untuk informasi lebih lanjut, lihat GetObject.

Referensi

  • Untuk informasi lebih lanjut tentang cara mengunduh objek dari bucket dengan versioning diaktifkan, lihat Kelola objek dalam bucket dengan versioning diaktifkan.

  • Untuk informasi lebih lanjut tentang cara mengunduh objek dari bucket dengan versioning ditangguhkan, lihat Kelola objek dalam bucket dengan versioning ditangguhkan.

  • OSS memungkinkan Anda mengonfigurasi daftar kontrol akses (ACL) untuk bucket dan objek. Dengan cara ini, pengguna pihak ketiga yang tidak sah tidak dapat mengunduh data dari bucket Anda. Untuk informasi lebih lanjut, lihat Ikhtisar.

  • Jika Anda ingin mengunduh objek langsung dari bucket, Anda dapat melakukan unduhan sederhana. Untuk informasi lebih lanjut, lihat Unduhan Sederhana.

  • Jika Anda ingin melanjutkan tugas unduhan yang terputus dari titik terputus saat mengunduh objek besar, Anda dapat menggunakan unduhan yang dapat dilanjutkan. Untuk informasi lebih lanjut, lihat Unduhan yang Dapat Dilanjutkan.

  • Jika Anda ingin memberikan izin kepada pengguna pihak ketiga untuk mengunduh objek dari bucket dengan ACL privat, gunakan Security Token Service (STS) untuk menghasilkan kredensial akses sementara atau gunakan URL yang ditandatangani. Untuk informasi lebih lanjut, lihat Otorisasi Pengguna Pihak Ketiga untuk Mengunduh Objek.