全部产品
Search
文档中心

Object Storage Service:Mengunduh objek menggunakan URL yang ditandatangani (PHP SDK V2)

更新时间:Nov 09, 2025

Secara default, objek di bucket Object Storage Service (OSS) bersifat pribadi dan hanya dapat diakses oleh pemilik objek. Topik ini menjelaskan cara menggunakan OSS PHP SDK untuk menghasilkan URL yang ditandatangani untuk permintaan GET. URL tersebut berlaku selama periode tertentu dan memungkinkan pengguna lain mengunduh objek secara sementara. URL ini dapat diakses beberapa kali sebelum kedaluwarsa. Setelah kedaluwarsa, Anda harus menghasilkan URL baru.

Catatan

  • Kode contoh dalam topik ini menggunakan ID Wilayah China (Hangzhou), cn-hangzhou, sebagai contoh. Secara default, ia menggunakan titik akhir publik. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir yang didukung oleh OSS, lihat Wilayah dan Titik Akhir.

  • Topik ini menggunakan variabel lingkungan untuk mendapatkan kredensial akses sebagai contoh. Untuk lebih banyak contoh tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan Kredensial Akses untuk PHP.

  • Anda tidak memerlukan izin khusus untuk menghasilkan URL yang ditandatangani. Namun, pihak ketiga hanya dapat berhasil mengunduh objek menggunakan URL yang ditandatangani jika Anda memiliki izin oss:GetObject. Untuk informasi lebih lanjut tentang cara memberikan izin, lihat Berikan Kebijakan Akses Kustom kepada Pengguna RAM.

  • Kode contoh dalam topik ini menggunakan URL yang ditandatangani V4, yang berlaku maksimal selama 7 hari. Untuk informasi lebih lanjut, lihat Signature V4 (Disarankan).

Proses

Bagan alir berikut menunjukkan cara mengunduh objek menggunakan URL yang ditandatangani.

Parameter

Parameter

Diperlukan

Deskripsi

Contoh

--region

Ya

Wilayah tempat bucket berada.

cn-hangzhou

--bucket

Ya

Nama bucket.

examplebucket

--key

Ya

Nama objek, termasuk jalur.

my-object.txt

--expire

Tidak

Waktu kedaluwarsa dalam detik. Default: 900.

600

--endpoint

Tidak

Titik akhir. Jika tidak ditentukan, sistem secara otomatis menggunakan titik akhir publik yang sesuai berdasarkan wilayah.

oss-cn-hangzhou.aliyuncs.com

Kode contoh

  1. Pemilik objek menghasilkan URL yang ditandatangani untuk permintaan GET.

    <?php
    
    // Impor file autoloader untuk memastikan bahwa library dependensi dimuat dengan benar.
    require_once __DIR__ . '/../../vendor/autoload.php';
    
    use AlibabaCloud\Oss\V2 as Oss;
    
    // Tentukan deskripsi untuk argumen baris perintah.
    $optsdesc = [
        "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. (Diperlukan)
        "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Titik akhir untuk mengakses OSS. (Opsional)
        "bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. (Diperlukan)
        "key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. (Diperlukan)
        "expire" => ['help' => 'Waktu kedaluwarsa dalam detik (default: 900)', 'required' => False], // Waktu kedaluwarsa dalam detik. (Opsional, default: 900)
    ];
    
    // Konversi deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt.
    // Tanda titik dua ":" setelah setiap argumen menunjukkan bahwa ia memerlukan nilai.
    $longopts = \array_map(function ($key) {
        return "$key:";
    }, array_keys($optsdesc));
    
    // Mengurai argumen baris perintah.
    $options = getopt("", $longopts);
    
    // Periksa apakah semua argumen yang diperlukan telah diberikan.
    foreach ($optsdesc as $key => $value) {
        if ($value['required'] === True && empty($options[$key])) {
            $help = $value['help']; // Dapatkan informasi bantuan untuk argumen tersebut.
            echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL;
            exit(1); // Jika argumen yang diperlukan tidak ada, keluar dari program.
        }
    }
    
    // Ekstrak nilai dari argumen yang diurai.
    $region = $options["region"]; // Wilayah tempat bucket berada.
    $bucket = $options["bucket"]; // Nama bucket.
    $key = $options["key"];       // Nama objek.
    $expire = isset($options["expire"]) ? (int)$options["expire"] : 900; // Waktu kedaluwarsa. Default: 900 detik.
    
    // Muat kredensial dari variabel lingkungan.
    // Gunakan EnvironmentVariableCredentialsProvider untuk membaca Access Key ID dan Access Key Secret dari variabel lingkungan.
    $credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
    
    // Gunakan konfigurasi default dari 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 titik akhir diberikan, setel itu.
    }
    
    try {
        // Buat instans klien OSS.
        $client = new Oss\Client($cfg);
    
        // Buat objek GetObjectRequest untuk mengunduh objek.
        $request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key);
    
        // Panggil metode presign untuk menghasilkan URL yang ditandatangani dan atur waktu kedaluwarsa.
        $result = $client->presign($request, [
            'expires' => new \DateInterval("PT{$expire}S") // PT berarti Period Time, dan S berarti detik.
        ]);
    
        // Keluarkan URL yang ditandatangani.
        echo "Signed URL: " . $result->url . PHP_EOL;
    } catch (Exception $e) {
        echo "Error: " . $e->getMessage() . PHP_EOL;
        exit(1);
    }
  2. Pengguna lain mengunduh objek menggunakan URL yang ditandatangani untuk permintaan GET.

    curl

    curl -SO "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"

    Java

    import java.io.BufferedInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class Demo {
        public static void main(String[] args) {
            // Tentukan URL yang telah ditandatangani yang mengizinkan permintaan HTTP GET. 
            String fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
            // Tentukan jalur tempat objek yang diunduh akan disimpan, termasuk nama objek dan ekstensi. 
            String savePath = "C:/downloads/myfile.txt";
    
            try {
                downloadFile(fileURL, savePath);
                System.out.println("Unduhan selesai!");
            } catch (IOException e) {
                System.err.println("Kesalahan selama pengunduhan: " + e.getMessage());
            }
        }
    
        private static void downloadFile(String fileURL, String savePath) throws IOException {
            URL url = new URL(fileURL);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            httpConn.setRequestMethod("GET");
    
            // Tentukan kode tanggapan.
            int responseCode = httpConn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // Konfigurasikan aliran masukan.
                InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
                // Konfigurasikan aliran keluaran.
                FileOutputStream outputStream = new FileOutputStream(savePath);
    
                byte[] buffer=new byte[4096]; // Tentukan ukuran buffer.
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
    
                outputStream.close();
                inputStream.close();
            } else {
                System.out.println("Tidak ada file untuk diunduh. Server menjawab dengan kode HTTP: " + responseCode);
            }
            httpConn.disconnect();
        }
    }

    Node.js

    const https = require('https');
    const fs = require('fs');
    
    const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
    const savePath = "C:/downloads/myfile.txt";
    
    https.get(fileURL, (response) => {
        if (response.statusCode === 200) {
            const fileStream = fs.createWriteStream(savePath);
            response.pipe(fileStream);
            
            fileStream.on('finish', () => {
                fileStream.close();
                console.log("Unduhan selesai!");
            });
        } else {
            console.error(`Pengunduhan gagal. Server merespons dengan kode: ${response.statusCode}`);
        }
    }).on('error', (err) => {
        console.error("Kesalahan selama pengunduhan:", err.message);
    });

    Python

    import requests
    
    file_url = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"
    save_path = "C:/downloads/myfile.txt"
    
    try:
        response = requests.get(file_url, stream=True)
        if response.status_code == 200:
            with open(save_path, 'wb') as f:
                for chunk in response.iter_content(4096):
                    f.write(chunk)
            print("Unduhan selesai!")
        else:
            print(f"Tidak ada file untuk diunduh. Server menjawab dengan kode HTTP: {response.status_code}")
    except Exception as e:
        print("Kesalahan selama pengunduhan:", e)

    Go

    package main
    
    import (
        "io"
        "net/http"
        "os"
    )
    
    func main() {
        fileURL := "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"
        savePath := "C:/downloads/myfile.txt"
    
        response, err := http.Get(fileURL)
        if err != nil {
            panic(err)
        }
        defer response.Body.Close()
    
        if response.StatusCode == http.StatusOK {
            outFile, err := os.Create(savePath)
            if err != nil {
                panic(err)
            }
            defer outFile.Close()
    
            _, err = io.Copy(outFile, response.Body)
            if err != nil {
                panic(err)
            }
            println("Unduhan selesai!")
        } else {
            println("Tidak ada file untuk diunduh. Server menjawab dengan kode HTTP:", response.StatusCode)
        }
    }

    JavaScript

    const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
    const savePath = "C:/downloads/myfile.txt"; // Tentukan nama objek yang diunduh.
    
    fetch(fileURL)
        .then(response => {
            if (!response.ok) {
                throw new Error(`Server menjawab dengan kode HTTP: ${response.status}`);
            }
            return response.blob(); // Ubah tipe tanggapan menjadi blob.
        })
        .then(blob => {
            const link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download=savePath; // Tentukan nama objek yang diunduh.
            document.body.appendChild(link); // Langkah ini memastikan bahwa URL yang ditandatangani ada dalam dokumen.
            link.click(); // Klik URL yang ditandatangani untuk mensimulasikan unduhan objek.
            link.remove(); // Hapus URL yang ditandatangani setelah objek diunduh.
            console.log("Unduhan selesai!");
        })
        .catch(error => {
            console.error("Kesalahan selama pengunduhan:", error);
        });

    Android-Java

    import android.os.AsyncTask;
    import android.os.Environment;
    import java.io.BufferedInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class DownloadTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String fileURL = params[0];
            String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myfile.txt"; // Tentukan jalur tempat Anda ingin menyimpan objek yang diunduh.
            try {
                URL url = new URL(fileURL);
                HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
                httpConn.setRequestMethod("GET");
                int responseCode = httpConn.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
                    FileOutputStream outputStream = new FileOutputStream(savePath);
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                    outputStream.close();
                    inputStream.close();
                    return "Unduhan selesai!";
                } else {
                    return "Tidak ada file untuk diunduh. Server menjawab dengan kode HTTP: " + responseCode;
                }
            } catch (Exception e) {
                return "Kesalahan selama pengunduhan: " + e.getMessage();
            }
        }
    }

    Objective-C

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // Tentukan URL yang telah ditandatangani dan jalur tempat Anda ingin menyimpan objek.
            NSString *fileURL = @"https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************";
            NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // Ganti your_username dengan nama pengguna Anda.
            
            // Buat objek URL.
            NSURL *url = [NSURL URLWithString:fileURL];
            
            // Buat tugas unduhan objek.
            NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                // Tangani kesalahan.
                if (error) {
                    NSLog(@"Kesalahan selama pengunduhan: %@", error.localizedDescription);
                    return;
                }
                
                // Periksa data dalam objek.
                if (!data) {
                    NSLog(@"Tidak ada data yang diterima.");
                    return;
                }
                
                // Simpan objek.
                NSError *writeError = nil;
                BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError];
                if (success) {
                    NSLog(@"Unduhan selesai!");
                } else {
                    NSLog(@"Kesalahan menyimpan file: %@", writeError.localizedDescription);
                }
            }];
            
            // Mulai tugas unduhan objek.
            [task resume];
            
            // Lanjutkan menjalankan utas utama untuk menyelesaikan permintaan asinkron.
            [[NSRunLoop currentRunLoop] run];
        }
        return 0;
    }

Skenario umum

Hasilkan URL yang ditandatangani untuk permintaan GET guna mengunduh versi tertentu dari sebuah objek

Kode sampel berikut menunjukkan cara menghasilkan URL yang ditandatangani untuk permintaan GET guna mengunduh versi tertentu dari sebuah objek.

<?php

// Impor file autoloader untuk memastikan bahwa library dependensi dimuat dengan benar.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

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

// Ubah deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt.
// Tanda titik dua ":" setelah setiap argumen menunjukkan bahwa ia memerlukan nilai.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

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

// Periksa apakah semua argumen yang diperlukan telah diberikan.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan untuk argumen tersebut.
        echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL;
        exit(1); // Jika argumen yang diperlukan tidak ada, keluar dari program.
    }
}

// Ekstrak nilai dari argumen yang telah di-parse.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"];       // Nama objek.

// Muat kredensial dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk membaca Access Key ID dan Access Key Secret dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default dari 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 titik akhir diberikan, setel itu.
}

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

$versionId = "yourVersionId"; // Nomor versi. Ini adalah nilai contoh. Ganti dengan ID versi yang sebenarnya.

// Buat objek GetObjectRequest untuk mengunduh objek.
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, versionId: $versionId);

// Panggil metode presign untuk menghasilkan URL yang ditandatangani.
$result = $client->presign($request);

// Cetak hasil presign.
// Keluarkan URL yang ditandatangani, yang dapat digunakan pengguna secara langsung untuk mengunduh objek.
print(
    'get object presign result:' . var_export($result, true) . PHP_EOL . // Informasi rinci tentang hasil presign.
    'get object url:' . $result->url . PHP_EOL                           // URL yang ditandatangani untuk mengunduh objek secara langsung.
);

Unduh objek dengan header permintaan tertentu menggunakan URL yang ditandatangani

Jika Anda menentukan header permintaan saat menghasilkan URL yang ditandatangani untuk permintaan GET, Anda harus menyertakan header yang sama dalam permintaan GET. Jika header tidak cocok, permintaan akan gagal karena kesalahan tanda tangan.

  1. Hasilkan URL yang ditandatangani untuk permintaan GET dengan header permintaan.

    <?php
    
    // Impor file autoloader untuk memastikan bahwa library dependensi dimuat dengan benar.
    require_once __DIR__ . '/../vendor/autoload.php';
    
    use AlibabaCloud\Oss\V2 as Oss;
    
    // Tentukan deskripsi untuk argumen baris perintah.
    $optsdesc = [
        "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. (Diperlukan)
        "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Titik akhir untuk mengakses OSS. (Opsional)
        "bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. (Diperlukan)
        "key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. (Diperlukan)
    ];
    
    // Ubah deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt.
    // Tanda titik dua ":" setelah setiap argumen menunjukkan bahwa ia memerlukan nilai.
    $longopts = \array_map(function ($key) {
        return "$key:";
    }, array_keys($optsdesc));
    
    // Parse argumen baris perintah.
    $options = getopt("", $longopts);
    
    // Periksa apakah semua argumen yang diperlukan telah diberikan.
    foreach ($optsdesc as $key => $value) {
        if ($value['required'] === True && empty($options[$key])) {
            $help = $value['help']; // Dapatkan informasi bantuan untuk argumen tersebut.
            echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL;
            exit(1); // Jika argumen yang diperlukan tidak ada, keluar dari program.
        }
    }
    
    // Ekstrak nilai dari argumen yang telah di-parse.
    $region = $options["region"]; // Wilayah tempat bucket berada.
    $bucket = $options["bucket"]; // Nama bucket.
    $key = $options["key"];       // Nama objek.
    
    // Muat kredensial dari variabel lingkungan.
    // Gunakan EnvironmentVariableCredentialsProvider untuk membaca Access Key ID dan Access Key Secret dari variabel lingkungan.
    $credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
    
    // Gunakan konfigurasi default dari 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 titik akhir diberikan, setel itu.
    }
    
    // Buat instance klien OSS.
    $client = new Oss\Client($cfg);
    
    // Tentukan header permintaan rangeBehavior. Di sini, diatur ke 'standard'.
    $rangeBehavior = 'standard';
    
    // Buat objek GetObjectRequest untuk mengunduh objek.
    $request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, rangeBehavior: $rangeBehavior);
    
    // Panggil metode presign untuk menghasilkan URL yang ditandatangani.
    $result = $client->presign($request);
    
    // Cetak hasil presign.
    // Keluarkan URL yang ditandatangani, yang dapat digunakan pengguna secara langsung untuk mengunduh objek.
    print(
        'get object presign result:' . var_export($result, true) . PHP_EOL . // Informasi rinci tentang hasil presign.
        'get object url:' . $result->url . PHP_EOL                           // URL yang ditandatangani untuk mengunduh objek secara langsung.
    );
    
  2. Unduh objek menggunakan URL yang ditandatangani dan tentukan header permintaan.

    curl -X GET "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241113T093321Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5tKHJzUF3wMmACXgf1aH****************&x-oss-signature=f1746f121783eed5dab2d665da95fbca08505263e27476a46f88dbe3702af8a9***************************************" \
    -H "x-oss-range-behavior: standard" \
    -o "myfile.txt"

Hasilkan URL yang ditandatangani untuk unduhan menggunakan nama domain kustom

Kode sampel berikut menunjukkan cara menghasilkan URL yang ditandatangani untuk unduhan menggunakan nama domain kustom.

Peringatan

Anda harus terlebih dahulu memetakan nama domain kustom ke nama domain default bucket. Jika tidak, akan terjadi kesalahan. Untuk informasi lebih lanjut, lihat Akses OSS Menggunakan Nama Domain Kustom.

<?php

// Impor file autoloader untuk memastikan bahwa library dependensi dimuat dengan benar.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

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

// Ubah deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt.
// Tanda titik dua ":" setelah setiap argumen menunjukkan bahwa ia memerlukan nilai.
$longopts = \array_map(function ($key) {
    return "$key:";
}, array_keys($optsdesc));

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

// Periksa apakah semua argumen yang diperlukan telah diberikan.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan untuk argumen tersebut.
        echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL;
        exit(1); // Jika argumen yang diperlukan tidak ada, keluar dari program.
    }
}

// Ekstrak nilai dari argumen yang telah di-parse.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"];       // Nama objek.

// Muat kredensial dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk membaca Access Key ID dan Access Key Secret dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default dari SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Setel penyedia kredensial.
$cfg->setRegion($region); // Setel wilayah tempat bucket berada.
$cfg->setEndpoint(endpoint: "http://static.example.com"); // Setel ini ke titik akhir kustom Anda.
$cfg->setUseCname(true); // Setel untuk menggunakan CNAME.

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


// Buat objek GetObjectRequest untuk mengunduh objek.
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key);

// Panggil metode presign untuk menghasilkan URL yang ditandatangani.
$result = $client->presign($request);

// Cetak hasil presign.
// Keluarkan URL yang ditandatangani, yang dapat digunakan pengguna secara langsung untuk mengunduh objek.
print(
    'get object presign result:' . var_export($result, true) . PHP_EOL . // Informasi rinci tentang hasil presign.
    'get object url:' . $result->url . PHP_EOL                           // URL yang ditandatangani untuk mengunduh objek secara langsung.
);

Referensi

  • Untuk kode contoh lengkap untuk menghasilkan URL yang ditandatangani, lihat Contoh GitHub.

  • Untuk informasi lebih lanjut tentang operasi API Presign, lihat Presign.