全部产品
Search
文档中心

Object Storage Service:Unduh objek menggunakan URL yang ditandatangani sebelumnya (Java SDK V1)

更新时间:Dec 17, 2025

Secara default, objek dalam bucket Object Storage Service (OSS) bersifat privat. Hanya pemilik objek yang dapat mengaksesnya. Anda dapat menggunakan OSS SDK untuk Java guna menghasilkan URL yang ditandatangani sebelumnya untuk permintaan GET. URL ini mencakup waktu kedaluwarsa dan memungkinkan pihak lain untuk sementara mengunduh objek tersebut. URL tersebut dapat digunakan beberapa kali selama periode validitasnya. Setelah URL kedaluwarsa, Anda harus membuat URL baru.

Pertimbangan

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

  • Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.

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

  • Anda tidak memerlukan izin untuk menghasilkan URL yang ditandatangani sebelumnya. Namun, agar pihak ketiga dapat mengunduh objek menggunakan URL tersebut, pengguna yang menghasilkan URL harus memiliki izin oss:GetObject. Untuk informasi selengkapnya tentang cara memberikan izin, lihat Berikan izin kustom kepada RAM user.

  • Topik ini menggunakan contoh URL yang ditandatangani sebelumnya versi V4. Periode validitas maksimum adalah tujuh hari. Untuk informasi selengkapnya, lihat Signature Version 4 (Direkomendasikan).

Prosedur

Prosedur berikut menjelaskan cara mengunduh objek menggunakan URL yang ditandatangani sebelumnya:

image

Contoh kode

  1. Pemilik objek menghasilkan URL yang ditandatangani sebelumnya untuk permintaan 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 {
            // Contoh ini menggunakan titik akhir publik wilayah China (Hangzhou). Tentukan titik akhir yang sebenarnya.
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // Masukkan nama bucket. Misalnya, examplebucket.
            String bucketName = "examplebucket";
            // Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh mengandung nama bucket.
            String objectName = "exampleobject.txt";
            // Masukkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel Region ke cn-hangzhou.
            String region = "cn-hangzhou";
    
            // Buat instans OSSClient.
            // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
            OSS ossClient = OSSClientBuilder.create()
                    .endpoint(endpoint)
                    .credentialsProvider(credentialsProvider)
                    .clientConfiguration(clientBuilderConfiguration)
                    .region(region)
                    .build();
    
            try {
                // Tetapkan waktu kedaluwarsa URL yang ditandatangani sebelumnya dalam milidetik. Contoh ini menetapkan waktu kedaluwarsa selama satu jam.
                Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
                // Hasilkan URL yang ditandatangani sebelumnya untuk permintaan GET. Contoh ini tidak menyertakan header permintaan tambahan. Pengguna lain dapat langsung mengakses konten melalui browser.
                URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
                System.out.println(url);
            } catch (OSSException oe) {
                System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                        + "tetapi ditolak dengan tanggapan error karena suatu alasan.");
                System.out.println("Pesan Error:" + oe.getErrorMessage());
                System.out.println("Kode Error:" + oe.getErrorCode());
                System.out.println("ID Permintaan:" + oe.getRequestId());
                System.out.println("Host ID:" + oe.getHostId());
            } catch (ClientException ce) {
                System.out.println("Terjadi ClientException, yang berarti klien mengalami "
                        + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                        + "seperti tidak dapat mengakses jaringan.");
                System.out.println("Pesan Error:" + ce.getMessage());
            } finally {
                if (ossClient != null) {
                    ossClient.shutdown();
                }
            }
        }
    }
  2. Pengguna lain mengunduh objek menggunakan URL yang ditandatangani sebelumnya.

    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) {
            // Ganti dengan URL yang ditandatangani sebelumnya yang dihasilkan untuk permintaan 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******************************************************";
            // Masukkan jalur tujuan untuk menyimpan file, termasuk nama file dan ekstensi.
            String savePath = "C:/downloads/myfile.txt";
    
            try {
                downloadFile(fileURL, savePath);
                System.out.println("Pengunduhan selesai!");
            } catch (IOException e) {
                System.err.println("Terjadi kesalahan saat mengunduh: " + 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");
    
            // Periksa kode respons.
            int responseCode = httpConn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // Aliran input.
                InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
                // Aliran output.
                FileOutputStream outputStream = new FileOutputStream(savePath);
    
                byte[] buffer = new byte[4096]; // 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("Pengunduhan selesai!");
            });
        } else {
            console.error(`Pengunduhan gagal. Server merespons dengan kode: ${response.statusCode}`);
        }
    }).on('error', (err) => {
        console.error("Terjadi kesalahan saat mengunduh:", 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("Pengunduhan selesai!")
        else:
            print(f"Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: {response.status_code}")
    except Exception as e:
        print("Terjadi kesalahan saat mengunduh:", 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("Pengunduhan 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"; // Nama file yang akan digunakan untuk pengunduhan.
    
    fetch(fileURL)
        .then(response => {
            if (!response.ok) {
                throw new Error(`Server merespons dengan kode HTTP: ${response.status}`);
            }
            return response.blob(); // Ubah respons menjadi blob.
        })
        .then(blob => {
            const link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = savePath; // Tetapkan nama file yang diunduh.
            document.body.appendChild(link); // Langkah ini memastikan tautan ada dalam dokumen.
            link.click(); // Simulasikan klik pada tautan unduh.
            link.remove(); // Hapus tautan setelah selesai.
            console.log("Pengunduhan selesai!");
        })
        .catch(error => {
            console.error("Terjadi kesalahan saat mengunduh:", 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"; // Jalur penyimpanan yang dimodifikasi.
            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 "Pengunduhan selesai!";
                } else {
                    return "Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: " + responseCode;
                }
            } catch (Exception e) {
                return "Terjadi kesalahan saat mengunduh: " + e.getMessage();
            }
        }
    }

    Objective-C

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // Definisikan URL file dan jalur penyimpanan (ubah ke jalur yang valid).
            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 dengan username Anda.
            
            // Buat objek URL.
            NSURL *url = [NSURL URLWithString:fileURL];
            
            // Buat tugas unduh.
            NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                // Penanganan kesalahan.
                if (error) {
                    NSLog(@"Terjadi kesalahan saat mengunduh: %@", error.localizedDescription);
                    return;
                }
                
                // Periksa data.
                if (!data) {
                    NSLog(@"Tidak ada data yang diterima.");
                    return;
                }
                
                // Simpan file.
                NSError *writeError = nil;
                BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError];
                if (success) {
                    NSLog(@"Pengunduhan selesai!");
                } else {
                    NSLog(@"Terjadi kesalahan saat menyimpan file: %@", writeError.localizedDescription);
                }
            }];
            
            // Mulai tugas.
            [task resume];
            
            // Pertahankan thread utama agar permintaan asinkron dapat diselesaikan.
            [[NSRunLoop currentRunLoop] run];
        }
        return 0;
    }

Skema lainnya

Hasilkan URL yang ditandatangani sebelumnya untuk versi file tertentu

Contoh kode berikut menunjukkan cara menghasilkan URL yang ditandatangani sebelumnya untuk permintaan GET guna mengunduh versi tertentu dari suatu 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 {
        // Contoh ini menggunakan titik akhir publik wilayah China (Hangzhou). Tentukan titik akhir yang sebenarnya.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
	// Masukkan nama bucket. Misalnya, examplebucket.
        String bucketName = "examplebucket";
        // Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampleobject.txt";
        // Masukkan versionId objek.
        String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
        // Masukkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel Region ke cn-hangzhou.
        String region = "cn-hangzhou";

        // Buat instans OSSClient.
        // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
        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);
            // Tetapkan HttpMethod ke GET.
            generatePresignedUrlRequest.setMethod(HttpMethod.GET);
            // Tetapkan waktu kedaluwarsa URL yang ditandatangani sebelumnya dalam milidetik. Contoh ini menetapkan waktu kedaluwarsa selama satu jam.
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
            generatePresignedUrlRequest.setExpiration(expiration);
            // versionId objek.
            Map<String, String> queryParam = new HashMap<String, String>();
            queryParam.put("versionId", versionId);
            generatePresignedUrlRequest.setQueryParameter(queryParam);
            // Hasilkan URL yang ditandatangani sebelumnya.
            URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan tanggapan error karena suatu alasan.");
            System.out.println("Pesan Error:" + oe.getErrorMessage());
            System.out.println("Kode Error:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Terjadi ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Error:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Gunakan nama domain kustom untuk menghasilkan URL yang ditandatangani sebelumnya guna pengunduhan

Contoh kode berikut menunjukkan cara menggunakan nama domain kustom untuk menghasilkan URL yang ditandatangani sebelumnya untuk permintaan 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 {
        // Setel yourCustomEndpoint ke nama domain kustom Anda. Misalnya, http://static.example.com.
        String endpoint = "yourCustomEndpoint";
        // Masukkan informasi wilayah bucket Anda, misalnya cn-hangzhou.
        String region = "cn-hangzhou";
        // Masukkan nama bucket. Misalnya, examplebucket.
        String bucketName = "examplebucket";
        // Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampleobject.txt";

        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, konfigurasikan variabel lingkungan.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // Buat instans OSSClient.
        // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Catatan: Tetapkan nilai ini ke true untuk mengaktifkan opsi CNAME.
        clientBuilderConfiguration.setSupportCname(true);
        // Secara eksplisit nyatakan penggunaan algoritma signature V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Tetapkan waktu kedaluwarsa URL yang ditandatangani sebelumnya yang dihasilkan dalam milidetik. Contoh ini menetapkan waktu kedaluwarsa selama satu jam.
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);

            // Hasilkan URL yang ditandatangani sebelumnya.
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);

            // Tetapkan waktu kedaluwarsa.
            request.setExpiration(expiration);

            // Hasilkan URL yang ditandatangani sebelumnya untuk permintaan HTTP GET.
            URL signedUrl = ossClient.generatePresignedUrl(request);
            // Cetak URL yang ditandatangani sebelumnya.
            System.out.println("signed url for getObject: " + signedUrl);
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan tanggapan error karena suatu alasan.");
            System.out.println("Pesan Error:" + oe.getErrorMessage());
            System.out.println("Kode Error:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Terjadi ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Error:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Hasilkan URL yang ditandatangani sebelumnya untuk memaksa pengunduhan

Jika Anda menggunakan nama domain kustom untuk mengakses OSS atau mengaktifkan OSS sebelum pukul 00.00 pada 9 Oktober 2022, objek akan dipratinjau secara default saat diakses melalui URL. Untuk memaksa pengunduhan, tambahkan `Content-Disposition: attachment` ke header respons.

Contoh berikut menunjukkan cara memaksa pengunduhan saat menggunakan nama domain kustom. Metode yang sama berlaku untuk nama domain OSS 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 {
        // Masukkan nama domain kustom Anda. Misalnya, http://static.example.com.
        String endpoint = "http://static.example.com";
        // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();

        // Masukkan nama bucket. Misalnya, examplebucket.
        String bucketName = "examplebucket";
        // Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh mengandung nama bucket.
        String objectName = "exampleobject.txt";

        // Buat instans OSSClient.
        // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
        String region = "cn-hangzhou";
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Catatan: Jika Anda menggunakan nama domain kustom, Anda harus menyetel CNAME ke true.
        clientBuilderConfiguration.setSupportCname(true);

        //Tetapkan algoritma signature V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        URL signedUrl = null;
        try {
            // Tetapkan waktu kedaluwarsa URL yang ditandatangani sebelumnya yang dihasilkan dalam milidetik. Contoh ini menetapkan waktu kedaluwarsa selama satu jam.
            Date expiration = new Date(new Date().getTime() + 3600 * 1000L);

            // Definisikan nama file yang akan ditampilkan di sisi klien saat pengunduhan. Contoh ini menggunakan "homework.txt".
            String filename = "homework.txt";

            // Hasilkan URL yang ditandatangani sebelumnya.
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);

            // Tetapkan perilaku pengunduhan (paksa unduh alih-alih pratinjau) dan nama file.
            request.getResponseHeaders().setContentDisposition("attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));

            // Tetapkan waktu kedaluwarsa.
            request.setExpiration(expiration);

            // Hasilkan URL yang ditandatangani sebelumnya untuk permintaan HTTP GET.
            signedUrl = ossClient.generatePresignedUrl(request);
            // Cetak URL yang ditandatangani sebelumnya.
            System.out.println("signed url for getObject: " + signedUrl);
        } catch (OSSException oe) {
            System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, "
                    + "tetapi ditolak dengan tanggapan error karena suatu alasan.");
            System.out.println("Pesan Error:" + oe.getErrorMessage());
            System.out.println("Kode Error:" + oe.getErrorCode());
            System.out.println("ID Permintaan:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Terjadi ClientException, yang berarti klien mengalami "
                    + "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Error:" + ce.getMessage());
        }
    }

}

Referensi

  • Untuk kode contoh lengkap tentang mengunduh objek menggunakan URL yang ditandatangani sebelumnya, lihat contoh GitHub.

  • Untuk informasi selengkapnya tentang operasi API yang digunakan untuk menghasilkan URL yang ditandatangani sebelumnya, lihat GeneratePresignedUrlRequest.