全部产品
Search
文档中心

Object Storage Service:Gunakan URL dengan tanda tangan untuk mengunduh objek

更新时间:Jun 27, 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. Anda dapat menggunakan OSS SDK for Java untuk menghasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET dan memiliki periode validitas serta membagikan URL dengan tanda tangan kepada pengguna untuk sementara waktu mengizinkan pengguna mengunduh objek. Selama periode validitas, pengguna dapat mengunduh objek berulang kali. Setelah periode validitas berakhir, pengguna harus mendapatkan URL dengan tanda tangan baru.

Catatan Penggunaan

  • Dalam topik ini, endpoint publik wilayah China (Hangzhou) digunakan. Untuk mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan endpoint internal. Untuk detail tentang wilayah dan endpoint yang didukung, lihat Wilayah dan endpoint.

  • Dalam topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan kredensial akses.

  • Dalam topik ini, instance OSSClient dibuat menggunakan endpoint OSS. Jika Anda ingin membuat instance OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Contoh konfigurasi untuk skenario umum.

  • Anda tidak memerlukan izin khusus untuk menghasilkan URL dengan tanda tangan. Namun, untuk mengizinkan orang lain menggunakan URL dengan tanda tangan 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 dengan tanda tangan yang memiliki periode validitas hingga 7 hari. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Sertakan tanda tangan V4 dalam URL.

Proses

Bagan alur berikut menunjukkan cara mengunduh objek menggunakan URL dengan tanda tangan.

Kode Contoh

  1. Berikut adalah contoh kode yang menunjukkan cara menghasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET:

    import com.aliyun.oss.*;
    import com.aliyun.oss.common.auth.*;
    import com.aliyun.oss.common.comm.SignVersion;
    
    import java.net.URL;
    import java.util.Date;
    
    public class Demo {
        public static void main(String[] args) throws Throwable {
            // 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. Contoh: exampleobject.txt. Jangan sertakan nama bucket dalam jalur lengkap objek.
            String objectName = "exampleobject.txt";
            // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou.
            String region = "cn-hangzhou";
    
            // Buat instance OSSClient.
            // Panggil metode shutdown untuk melepaskan sumber daya ketika 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 {
                // Tentukan periode validitas URL dengan tanda tangan. Unit: milidetik. Dalam contoh ini, periode validitas adalah 1 jam.
                Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
                // Hasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET. Dalam contoh ini, tidak ada header permintaan tambahan yang ditentukan. Pengguna lain dapat mengakses konten terkait langsung menggunakan browser.
                URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
                System.out.println(url);
            } catch (OSSException oe) {
                System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                        + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
                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();
                }
            }
        }
    }
  2. Berikut adalah contoh kode yang menunjukkan cara menggunakan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET 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 dengan tanda tangan yang memungkinkan 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 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 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 membalas 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 membalas 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 membalas 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 membalas dengan kode HTTP: ${response.status}`);
            }
            return response.blob(); // Ubah tipe 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 dengan tanda tangan ada dalam dokumen.
            link.click(); // Klik URL dengan tanda tangan untuk mensimulasikan unduhan objek.
            link.remove(); // Hapus URL dengan tanda tangan 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.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 membalas 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 dengan tanda tangan 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 utas utama untuk menyelesaikan permintaan asinkron.
            [[NSRunLoop currentRunLoop] run];
        }
        return 0;
    }

Skenario Umum

Hasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET untuk versi tertentu dari objek

Berikut adalah contoh kode yang menghasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET untuk versi tertentu dari objek:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.*;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // 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. Contoh: exampleobject.txt. Jangan sertakan nama bucket dalam jalur lengkap objek.
        String objectName = "exampleobject.txt";
        // Tentukan ID versi objek.
        String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
        // Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instance OSSClient.
        // Panggil metode shutdown untuk melepaskan sumber daya ketika 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 {
            // Buat permintaan.
            GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
            // Atur HttpMethod ke GET.
            generatePresignedUrlRequest.setMethod(HttpMethod.GET);
            // Tentukan periode validitas URL dengan tanda tangan. Unit: milidetik. Dalam contoh ini, periode validitas adalah 1 jam.
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
            generatePresignedUrlRequest.setExpiration(expiration);
            // Tentukan ID versi objek.
            Map<String, String> queryParam = new HashMap<String, String>();
            queryParam.put("versionId", versionId);
            generatePresignedUrlRequest.setQueryParameter(queryParam);
            // Hasilkan URL dengan tanda tangan.
            URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            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();
            }
        }
    }
}

Hasilkan URL dengan tanda tangan menggunakan nama domain kustom dan gunakan URL dengan tanda tangan untuk mengunduh objek

Berikut adalah contoh kode yang menggunakan nama domain kustom untuk menghasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET:

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;

import java.net.URL;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // Tentukan nama domain kustom. Contoh: https://static.example.com.
        String endpoint = "yourCustomEndpoint";
        // Tentukan wilayah tempat bucket berada. Contoh: cn-hangzhou.
        String region = "cn-hangzhou";
        // Tentukan nama bucket. Contoh: examplebucket.
        String bucketName = "examplebucket";
        // Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt.
        String objectName = "exampleobject.txt";

        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, Anda harus mengonfigurasi variabel lingkungan.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // Buat instance OSSClient.
        // Panggil metode shutdown untuk melepaskan sumber daya ketika OSSClient tidak lagi digunakan.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Untuk mengaktifkan CNAME, atur parameter ini ke true.
        clientBuilderConfiguration.setSupportCname(true);
        // Deklarasikan secara eksplisit penggunaan algoritma tanda tangan V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Tentukan periode validitas URL dengan tanda tangan. Unit: milidetik. Dalam contoh ini, periode validitas diatur menjadi 1 jam.
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);

            // Hasilkan URL dengan tanda tangan.
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);

            // Atur periode validitas URL.
            request.setExpiration(expiration);

            // Hasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET.
            URL signedUrl = ossClient.generatePresignedUrl(request);
            // Tampilkan URL dengan tanda tangan.
            System.out.println("signed url for getObject: " + signedUrl);
        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            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();
            }
        }
    }
}

Hasilkan URL dengan tanda tangan yang memaksa unduhan objek

Jika Anda menggunakan nama domain kustom untuk mengakses objek atau mengaktifkan OSS sebelum 00:00 pada tanggal 9 Oktober 2022, objek akan dipreview. Untuk memaksa unduhan objek, tambahkan Content-Disposition: attachment ke header respons.

Berikut adalah contoh kode yang menunjukkan cara memaksa unduhan objek ketika Anda menggunakan nama domain kustom untuk mengakses objek. Konfigurasi ini berlaku untuk nama domain default.

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;

import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;

public class Demo { 
    public static void main(String[] args) throws Throwable {
        // Tentukan nama domain kustom. Contoh: https://static.example.com.
        String endpoint = "http://static.example.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. Contoh: exampleobject.txt. Jangan sertakan nama bucket dalam jalur lengkap objek.
        String objectName = "exampleobject.txt";

        // Buat instance OSSClient.
        // Panggil metode shutdown untuk melepaskan sumber daya ketika OSSClient tidak lagi digunakan.
        String region = "cn-hangzhou";
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Perhatikan bahwa jika Anda menggunakan nama domain kustom, Anda harus mengatur CNAME ke true.
        clientBuilderConfiguration.setSupportCname(true);

        // Deklarasikan secara eksplisit penggunaan algoritma tanda tangan V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        URL signedUrl = null;
        try {
            // Tentukan periode validitas URL dengan tanda tangan. Unit: milidetik. Dalam contoh ini, periode validitas adalah 1 jam.
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);

            // Tentukan nama objek yang ingin Anda unduh secara paksa. Contoh: homework.txt.
            String filename = "homework.txt";

            // Hasilkan URL dengan tanda tangan.
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);

            // Tentukan bahwa objek diunduh secara paksa dan tentukan nama objek yang diunduh.
            request.getResponseHeaders().setContentDisposition("attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));

            // Atur periode validitas permintaan.
            request.setExpiration(expiration);

            // Hasilkan URL dengan tanda tangan yang memungkinkan permintaan HTTP GET.
            signedUrl = ossClient.generatePresignedUrl(request);
            // Tampilkan URL dengan tanda tangan.
            System.out.println("signed url for getObject: " + signedUrl);
        } catch (OSSException oe) {
            System.out.println("Tangkap OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan respons kesalahan karena suatu alasan.");
            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());
        }
    }

}

Referensi

  • Untuk kode contoh lengkap yang digunakan untuk mengunduh objek menggunakan URL dengan tanda tangan, kunjungi GitHub.

  • Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk mengunduh objek menggunakan URL dengan tanda tangan, lihat GeneratePresignedUrlRequest.