全部产品
Search
文档中心

Object Storage Service:Menggunakan URL yang ditandatangani untuk mengunduh objek dengan OSS SDK untuk Python 2.0

更新时间:Nov 09, 2025

Secara default, daftar kontrol akses (ACL) dari sebuah objek dalam bucket Object Storage Service (OSS) bersifat pribadi. Hanya pemilik objek yang memiliki izin untuk mengakses objek tersebut. Topik ini menjelaskan cara menggunakan OSS SDK untuk Python untuk menghasilkan URL yang ditandatangani yang memungkinkan pengguna mengunduh objek tertentu dalam periode waktu yang ditentukan menggunakan metode HTTP GET. Selama periode validitas, pengguna dapat mengakses objek berulang kali menggunakan URL yang ditandatangani. Jika URL yang ditandatangani kedaluwarsa, Anda dapat menghasilkan kembali URL tersebut untuk memperpanjang akses bagi pengguna.

Catatan Penggunaan

  • Kode contoh dalam topik ini menggunakan ID wilayah cn-hangzhou dari Wilayah Hangzhou, Tiongkok. Secara default, titik akhir publik digunakan untuk mengakses sumber daya dalam bucket. Jika Anda ingin mengakses sumber daya di bucket dari layanan Alibaba Cloud lainnya di wilayah yang sama dengan lokasi bucket, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.

  • Anda tidak memerlukan izin khusus untuk menghasilkan URL yang ditandatangani. Namun, untuk mengizinkan orang lain menggunakan URL yang ditandatangani untuk mengunduh objek, Anda harus memiliki izin oss:GetObject. Untuk informasi lebih lanjut, lihat Contoh Umum Kebijakan RAM.

  • Dalam topik ini, algoritma tanda tangan V4 digunakan untuk menghasilkan URL yang ditandatangani dengan periode validitas hingga 7 hari. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Tanda Tangan V4 dalam URL yang Ditandatangani.

Proses

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

Definisi Metode

Anda dapat memanggil metode presign untuk menghasilkan URL yang ditandatangani yang memberikan akses terbatas waktu ke objek OSS. URL yang ditandatangani dapat digunakan beberapa kali sebelum kedaluwarsa.

Baris berikut menunjukkan sintaksis metode presign:

presign(request: GetObjectRequest, **kwargs) → PresignResult

Parameter Permintaan

Parameter

Tipe

Deskripsi

request

GetObjectRequest

Operasi API yang ingin Anda dukung dengan URL yang ditandatangani. Untuk informasi lebih lanjut, lihat Client.presign.

expires

datetime.timedelta

Periode validitas URL yang ditandatangani mulai dari waktu saat ini. Ini adalah parameter opsional. Misalnya, jika Anda ingin menetapkan periode validitas selama 30 menit, atur expires menjadi 30 * time.Minute. Jika Anda tidak menentukan parameter ini, URL yang ditandatangani akan memiliki periode validitas default selama 15 menit.

expiration

datetime.datetime

Tanggal dan waktu kedaluwarsa absolut dari URL yang ditandatangani. Ini adalah parameter opsional.

Penting

Jika Anda menggunakan algoritma tanda tangan V4, periode validitas bisa mencapai tujuh hari. Jika Anda menentukan expiration dan expires, expiration akan diutamakan.

Parameter Tanggapan

Tipe

Deskripsi

PresignResult

Hasil yang dikembalikan, termasuk URL yang ditandatangani, metode HTTP, waktu kedaluwarsa, dan header permintaan yang ditentukan dalam permintaan. Untuk informasi lebih lanjut, lihat PresignResult.

Isi dari PresignResult

Parameter

Tipe

Deskripsi

method

str

Metode HTTP, yang sesuai dengan operasi API yang ditentukan dalam permintaan presign. Sebagai contoh, metode HTTP dari operasi GetObject adalah GET.

url

str

URL yang ditandatangani.

expiration

datetime

Waktu kedaluwarsa dari URL yang ditandatangani.

signed_headers

MutableMapping

Header yang ditandatangani yang ditentukan dalam permintaan. Sebagai contoh, jika content_type ditentukan, content_type akan dikembalikan.

Untuk informasi lebih lanjut tentang metode presign, lihat presign.

Kode Contoh

  1. Hasilkan URL yang ditandatangani yang mengizinkan permintaan HTTP GET:

    import argparse
    import alibabacloud_oss_v2 as oss
    
    # Buat parser parameter baris perintah dan jelaskan tujuan dari skrip.
    parser = argparse.ArgumentParser(description="contoh presign get object")
    
    # Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
    parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
    # Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
    parser.add_argument('--bucket', help='Nama bucket.', required=True)
    # Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
    parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
    # Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib.
    parser.add_argument('--key', help='Nama objek.', required=True)
    
    def main():
        # Parse 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 cfg dan tentukan penyedia kredensial.
        cfg = oss.config.load_default()
        cfg.credentials_provider = credentials_provider
        
        # Atur atribut region objek cfg ke wilayah yang diberikan di baris perintah.
        cfg.region = args.region
    
        # Jika titik akhir kustom diberikan, perbarui atribut endpoint objek cfg dengan titik akhir yang diberikan.
        if args.endpoint is not None:
            cfg.endpoint = args.endpoint
    
        # Gunakan pengaturan sebelumnya untuk menginisialisasi instance OSSClient.
        client = oss.Client(cfg)
    
        # Mulai permintaan untuk menghasilkan URL yang ditandatangani.
        pre_result = client.presign(
            oss.GetObjectRequest(
                bucket=args.bucket,  # Tentukan nama bucket.
                key=args.key,        # Tentukan kunci objek.
            )
        )
    
        # Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani.
        print(f'method: {pre_result.method},'
              f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
              f' url: {pre_result.url}'
        )
    
        # Tampilkan header yang ditandatangani.
        for key, value in pre_result.signed_headers.items():
            print(f'signed headers key: {key}, signed headers value: {value}')
    
    # Panggil fungsi utama untuk memulai logika pemrosesan ketika skrip dijalankan langsung.
    if __name__ == "__main__":
        main()  # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.
  2. Gunakan URL yang ditandatangani untuk mengunduh objek.

    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 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 unduhan: " + 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 respons.
            int responseCode = httpConn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // Konfigurasikan input stream.
                InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
                // Konfigurasikan output stream.
                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 merespons 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(`Unduhan gagal. Server merespons dengan kode: ${response.statusCode}`);
        }
    }).on('error', (err) => {
        console.error("Kesalahan selama unduhan:", 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 merespons dengan kode HTTP: {response.status_code}")
    except Exception as e:
        print("Kesalahan selama unduhan:", 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 merespons 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 merespons dengan kode HTTP: ${response.status}`);
            }
            return response.blob(); // Ubah jenis respons 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 unduhan:", error);
        });

    Android-Java

    import android.os.AsyncTask;
    import android.os.Environment;
    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 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 merespons dengan kode HTTP: " + responseCode;
                }
            } catch (Exception e) {
                return "Kesalahan selama unduhan: " + e.getMessage();
            }
        }
    }

    Objective-C

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // Tentukan URL yang 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 unduhan: %@", 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 thread utama untuk menyelesaikan permintaan asinkron.
            [[NSRunLoop currentRunLoop] run];
        }
        return 0;
    }

Skenario Umum

Hasilkan URL yang ditandatangani yang mengizinkan permintaan HTTP GET untuk versi tertentu dari objek

Kode contoh berikut menghasilkan URL yang ditandatangani yang mengizinkan permintaan HTTP GET untuk versi tertentu dari objek:

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser parameter baris perintah dan jelaskan tujuan dari skrip.
parser = argparse.ArgumentParser(description="contoh presign get object")

# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)

def main():
    # Parse 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 cfg dan tentukan penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    
    # Tentukan atribut region objek konfigurasi berdasarkan parameter baris perintah yang ditentukan oleh pengguna.
    cfg.region = args.region

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

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

    # Mulai permintaan untuk menghasilkan URL yang ditandatangani.
    # Parameter version_id opsional. Anda hanya perlu menentukan parameter ini ketika bucket yang berisi objek diaktifkan versinya.
    pre_result = client.presign(
        oss.GetObjectRequest(
            bucket=args.bucket,  # Tentukan nama bucket.
            key=args.key,        # Tentukan kunci objek.
            version_id='yourVersionId'  # Jika berlaku, tentukan ID versi objek.
        )
    )

    # Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani.
    print(f'method: {pre_result.method},'
          f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
          f' url: {pre_result.url}'
    )

    # Tampilkan header yang ditandatangani.
    for key, value in pre_result.signed_headers.items():
        print(f'signed headers key: {key}, signed headers value: {value}')

# Panggil fungsi utama untuk memulai logika pemrosesan ketika skrip dijalankan langsung.
if __name__ == "__main__":
    main()  # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.

Unduh objek menggunakan URL yang ditandatangani yang berisi header permintaan yang ditentukan

Jika Anda menentukan header permintaan saat menghasilkan URL dengan tanda tangan yang mengizinkan permintaan HTTP GET, pastikan header permintaan tersebut termasuk dalam permintaan GET yang dimulai menggunakan URL dengan tanda tangan. Ini mencegah kegagalan permintaan dan kesalahan tanda tangan.

  1. Hasilkan URL yang telah ditandatangani yang berisi header permintaan spesifik dan mengizinkan permintaan HTTP GET.

    import argparse
    import alibabacloud_oss_v2 as oss
    
    # Buat parser argumen baris perintah dan jelaskan tujuan dari skrip.
    parser = argparse.ArgumentParser(description="contoh presign untuk mendapatkan objek")
    
    # Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
    parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
    # Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
    parser.add_argument('--bucket', help='Nama bucket.', required=True)
    # Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
    parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
    # Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib.
    parser.add_argument('--key', help='Nama objek.', required=True)
    
    def main():
        # Mengurai parameter baris perintah.
        args = parser.parse_args()
    
        # Dapatkan kredensial akses dari variabel lingkungan untuk otentikasi.
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # Gunakan konfigurasi default untuk membuat objek konfigurasi (cfg) dan tentukan penyedia kredensial.
        cfg = oss.config.load_default()
        cfg.credentials_provider = credentials_provider
    
        # Atur atribut region objek cfg ke region dalam parser.
        cfg.region = args.region
    
        # # Tentukan nama domain kustom.
        # cfg.endpoint = "http://ossv2.wangpeiyu.com"
        # # Aktifkan resolusi rekaman CNAME.
        # cfg.use_cname = True
    
        # Jika titik akhir kustom diberikan, perbarui atribut endpoint objek cfg dengan titik akhir yang diberikan.
        if args.endpoint is not None:
            cfg.endpoint = args.endpoint
    
        # Gunakan konfigurasi sebelumnya untuk menginisialisasi instans OSSClient.
        client = oss.Client(cfg)
    
        # Mulai permintaan untuk menghasilkan URL yang telah ditandatangani.
        pre_result = client.presign(
            oss.GetObjectRequest(
                bucket=args.bucket,  # Tentukan nama bucket.
                key=args.key,        # Tentukan kunci objek.
                range_behavior="standard", # Tentukan header permintaan.
                request_payer="requester", # Tentukan header permintaan.
            )
        )
    
        # Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang telah ditandatangani.
        print(f'metode: {pre_result.method},'
              f' kedaluwarsa: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
              f' url: {pre_result.url}'
        )
    
        # Tampilkan header yang telah ditandatangani.
        for key, value in pre_result.signed_headers.items():
            print(f'kunci header yang ditandatangani: {key}, nilai header yang ditandatangani: {value}')
    
    # Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan langsung.
    if __name__ == "__main__":
        main()  # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.
  2. Unduh objek menggunakan URL yang telah 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=LTAI****************&x-oss-signature=ed5a******************************************************" \
    -H "x-oss-range-behavior: standard" \
    -H "x-oss-request-payer: requester" \
    -o "myfile.txt"
    import requests
    
    def download_file(signed_url, file_path, headers=None, metadata=None):
        """
        Gunakan URL yang telah ditandatangani untuk mengunduh objek.
    
        :param signed_url: URL yang telah ditandatangani.
        param file_path: Jalur lokal lengkap tempat Anda ingin mengunduh objek.
        : param headers: Header permintaan. Parameter ini opsional.
        : param metadata: Metadata kustom. Parameter ini tidak diperlukan oleh permintaan GET.
        :return: None
        """
        if not headers:
            headers = {}
    
        try:
            response = requests.get(signed_url, headers=headers, stream=True)
            print(f"Kode status HTTP: {response.status_code}")
    
            if response.status_code == 200:
                with open(file_path, 'wb') as file:
                    for chunk in response.iter_content(chunk_size=8192):
                        if chunk:
                            file.write(chunk)
                print("Objek berhasil diunduh.")
            else:
                print("Objek gagal diunduh.")
                print(response.text)
        except Exception as e:
            print(f"Terjadi kesalahan: {e}")
    
    if __name__ == "__main__":
        # Ganti <signedUrl> dengan URL yang telah ditandatangani.
        signed_url = "<signedUrl>"
        file_path = "/Users/<yourLocalPath>/Downloads/downloadedFile.txt" # Jalur lokal tempat Anda ingin mengunduh objek.
    
        headers = {
            "X-Oss-Range-Behavior":"standard",
            "X-Oss-Request-Payer":"requester",
        }
    
        download_file(signed_url, file_path, headers=headers)

Unduh paksa objek dengan menggunakan URL yang telah ditandatangani

  1. Hasilkan URL yang berisi parameter response-content-disposition.

    import argparse
    import alibabacloud_oss_v2 as oss
    
    # Buat parser argumen baris perintah dan jelaskan tujuan dari skrip.
    parser = argparse.ArgumentParser(description="contoh presign untuk mendapatkan objek")
    
    # Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
    parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
    # Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
    parser.add_argument('--bucket', help='Nama bucket.', required=True)
    # Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
    parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
    # Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib.
    parser.add_argument('--key', help='Nama objek.', required=True)
    
    def main():
        # Mengurai parameter baris perintah.
        args = parser.parse_args()
    
        # Dapatkan kredensial akses dari variabel lingkungan untuk otentikasi.
        credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
    
        # Gunakan konfigurasi default untuk membuat objek konfigurasi (cfg) dan tentukan penyedia kredensial.
        cfg = oss.config.load_default()
        cfg.credentials_provider = credentials_provider
    
        # Atur atribut region dari objek cfg ke wilayah di dalam parser.
        cfg.region = args.region
    
        # Jika titik akhir kustom diberikan, perbarui atribut endpoint dari objek cfg dengan titik akhir yang diberikan.
        if args.endpoint is not None:
            cfg.endpoint = args.endpoint
    
        # Gunakan konfigurasi sebelumnya untuk menginisialisasi instance OSSClient.
        client = oss.Client(cfg)
    
        # Mulai permintaan untuk menghasilkan URL yang telah ditandatangani.
        pre_result = client.presign(
            oss.GetObjectRequest(
                bucket=args.bucket,  # Tentukan nama bucket.
                key=args.key,        # Tentukan kunci objek.
                response_content_disposition="attachment;filename=test.txt",
            )
        )
    
        # Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang telah ditandatangani.
        print(f'metode: {pre_result.method},'
              f' kedaluwarsa: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
              f' url: {pre_result.url}'
        )
    
        # Tampilkan header yang telah ditandatangani.
        for key, value in pre_result.signed_headers.items():
            print(f'kunci header yang ditandatangani: {key}, nilai header yang ditandatangani: {value}')
    
    # Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan langsung.
    if __name__ == "__main__":
        main()  # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.

  2. Gunakan URL yang telah ditandatangani untuk mengunduh objek yang ditentukan.

    curl -X GET "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?response-content-disposition=attachment%3B%20filename%3Dtest.txt&x-oss-date=20241113T093321Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************&x-oss-signature=ed5a******************************************************" \
    -o "myfile.txt"
    import requests
    
    def download_file(signed_url, file_path):
        """
        Gunakan URL yang telah ditandatangani untuk mengunduh objek. 
    
        :param signed_url: URL yang telah ditandatangani. 
        param file_path: Jalur lokal lengkap tempat Anda ingin mengunduh objek. 
        : param headers: Header permintaan. Parameter ini opsional. 
        : param metadata: Metadata kustom. Parameter ini tidak diperlukan oleh permintaan GET. 
        :return: None
        """
    
        try:
            response = requests.get(signed_url, stream=True)
            print(f"Kode status HTTP: {response.status_code}")
    
            if response.status_code == 200:
                with open(file_path, 'wb') as file:
                    for chunk in response.iter_content(chunk_size=8192):
                        if chunk:
                            file.write(chunk)
                print("Objek berhasil diunduh.")
            else:
                print("Objek gagal diunduh.")
                print(response.text)
        except Exception as e:
            print(f"Terjadi kesalahan: {e}")
    
    if __name__ == "__main__":
        # Ganti <signedUrl> dengan URL yang telah ditandatangani. 
        signed_url = "<signedUrl>"
        file_path = "/Users/<yourLocalPath>/Downloads/downloadedFile.txt" # Jalur lokal tempat Anda ingin mengunduh objek.
    
        download_file(signed_url, file_path)

Hasilkan URL yang ditandatangani untuk mengizinkan unduhan objek menggunakan titik akhir kustom

Kode sampel berikut menggunakan titik akhir kustom untuk menghasilkan URL yang ditandatangani yang mengizinkan permintaan HTTP GET:

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser parameter baris perintah dan jelaskan tujuan dari skrip.
parser = argparse.ArgumentParser(description="presign get object sample")

# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib.
parser.add_argument('--key', help='Nama objek.', required=True)

def main():
    # Parse parameter baris perintah untuk mendapatkan nilai-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 cfg dan tentukan penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider
    
    # Tentukan atribut region dari objek konfigurasi berdasarkan parameter baris perintah yang ditentukan oleh pengguna.
    cfg.region = args.region

    # Tentukan titik akhir kustom. Contoh: http://static.example.com
    cfg.endpoint = "http://static.example.com"
    
    # Aktifkan resolusi rekaman CNAME.
    cfg.use_cname = True

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

    # Mulai permintaan untuk menghasilkan URL yang ditandatangani.
    pre_result = client.presign(
        oss.GetObjectRequest(
            bucket=args.bucket,  # Tentukan nama bucket.
            key=args.key,        # Tentukan kunci objek.
        )
    )

    # Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani.
    print(f'method: {pre_result.method},'
          f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
          f' url: {pre_result.url}'
    )

    # Tampilkan header yang ditandatangani.
    for key, value in pre_result.signed_headers.items():
        print(f'signed headers key: {key}, signed headers value: {value}')

# Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan langsung.
if __name__ == "__main__":
    main()  # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.

Referensi

  • Untuk kode contoh lengkap untuk mengunduh objek menggunakan URL yang ditandatangani, lihat presigner_get_object.py.