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 for Go untuk menghasilkan URL pra-tandatangan yang memungkinkan pengguna sementara mengunduh objek melalui permintaan HTTP GET. URL tersebut berlaku selama periode tertentu, di mana pengguna dapat mengunduh objek beberapa kali. Setelah URL kedaluwarsa, pengguna harus mendapatkan URL pra-tandatangan baru.
Catatan
Kode contoh dalam topik ini menggunakan ID wilayah
cn-hangzhouuntuk Wilayah Hangzhou, Tiongkok. Secara default, titik akhir publik digunakan untuk mengakses sumber daya bucket. Jika Anda mengakses sumber daya bucket dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.Dalam topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan Kredensial Akses.
Anda tidak memerlukan izin khusus untuk menghasilkan URL pra-tandatangan. Namun, untuk mengizinkan orang lain menggunakan URL pra-tandatangan untuk mengunduh objek, Anda harus memiliki izin
oss:GetObject. Untuk informasi lebih lanjut, lihat Contoh Umum Kebijakan RAM.Dalam topik ini, URL pra-tandatangan V4 digunakan. URL ini memiliki masa berlaku maksimum tujuh hari. Untuk informasi lebih lanjut, lihat (Direkomendasikan) Sertakan Tanda Tangan V4 dalam URL.
Proses
Bagan alir berikut menunjukkan cara mengunduh objek menggunakan URL pra-tandatangan.
Definisi metode
Anda dapat memanggil operasi tertentu untuk menghasilkan URL pra-tandatangan yang memberikan izin akses sementara ke objek dalam bucket. URL pra-tandatangan dapat digunakan beberapa kali sebelum kedaluwarsa.
Kode berikut menunjukkan sintaksis operasi presign:
func (c *Client) Presign(ctx context.Context, request any, optFns ...func(*PresignOptions)) (result *PresignResult, err error)Parameter permintaan
Parameter | Tipe | Deskripsi |
ctx | context.Context | Konteks permintaan. |
request | *GetObjectRequest | Nama operasi API yang digunakan untuk menghasilkan URL pra-tandatangan. |
optFns | ...func(*PresignOptions) | Periode validitas URL pra-tandatangan. Jika Anda tidak menentukan parameter ini, URL pra-tandatangan menggunakan nilai default, yaitu 15 menit. Parameter ini opsional. |
Tabel berikut menjelaskan opsi untuk PresignOptions.
Opsi | Tipe | Deskripsi |
Expires | time.Duration | Periode validitas URL pra-tandatangan. Misalnya, jika Anda ingin menetapkan periode validitas menjadi 30 menit, atur Expires menjadi 30 * time.Minute. |
Expiration | time.Time | Waktu kedaluwarsa absolut URL pra-tandatangan. |
Jika Anda menggunakan algoritma tanda tangan V4, periode validitas bisa mencapai tujuh hari. Jika Anda menentukan baik Expiration maupun Expires, Expiration akan diutamakan.
Parameter respons
Properti Respons | Tipe | Deskripsi |
result | *PresignResult | Hasil yang dikembalikan, termasuk URL pra-tandatangan, metode HTTP, periode validitas, dan header permintaan yang ditentukan dalam permintaan. |
err | error | Status permintaan. Jika permintaan gagal, nilai err tidak boleh nil. |
Tabel berikut menjelaskan parameter respons dari PresignResult.
Parameter | Tipe | Deskripsi |
Method | string | Metode HTTP, yang sesuai dengan operasi. Misalnya, metode HTTP dari operasi GetObject adalah GET. |
URL | string | URL pra-tandatangan. |
Expiration | time.Time | Waktu kedaluwarsa URL pra-tandatangan. |
SignedHeaders | map[string]string | Header permintaan yang ditentukan dalam permintaan. Misalnya, jika nilai header Content-Type ditentukan, informasi tentang Content-Type dikembalikan. |
Kode contoh
Kode contoh berikut menunjukkan bagaimana pemilik objek dapat menghasilkan URL pra-tandatangan yang mengizinkan permintaan HTTP GET:
package main import ( "context" "flag" "log" "time" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" ) // Tentukan variabel global. var ( region string // Wilayah tempat bucket berada. bucketName string // Nama bucket. objectName string // Nama objek. ) // Fungsi init digunakan untuk menginisialisasi parameter baris perintah. func init() { flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.") flag.StringVar(&bucketName, "bucket", "", "Nama bucket.") flag.StringVar(&objectName, "object", "", "Nama objek.") } func main() { // Parsing parameter baris perintah. flag.Parse() // Periksa apakah nama bucket kosong. if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("parameter tidak valid, nama bucket diperlukan") } // Periksa apakah wilayah kosong. if len(region) == 0 { flag.PrintDefaults() log.Fatalf("parameter tidak valid, wilayah diperlukan") } // Periksa apakah nama objek kosong. if len(objectName) == 0 { flag.PrintDefaults() log.Fatalf("parameter tidak valid, nama objek diperlukan") } // Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah. cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region) // Buat klien OSS. client := oss.NewClient(cfg) // Hasilkan URL pra-tandatangan untuk permintaan GetObject. result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{ Bucket: oss.Ptr(bucketName), Key: oss.Ptr(objectName), }, oss.PresignExpires(10*time.Minute), ) if err != nil { log.Fatalf("gagal mendapatkan object presign %v", err) } log.Printf("metode permintaan:%v\n", result.Method) log.Printf("kedaluwarsa permintaan:%v\n", result.Expiration) log.Printf("url permintaan:%v\n", result.URL) if len(result.SignedHeaders) > 0 { // Jika hasil yang dikembalikan berisi header yang ditandatangani, Anda harus menyertakan header permintaan yang sesuai saat mengirim permintaan GET menggunakan URL pra-tandatangan. Jika tidak, permintaan mungkin gagal atau terjadi kesalahan tanda tangan. log.Printf("header yang ditandatangani:\n") for k, v := range result.SignedHeaders { log.Printf("%v: %v\n", k, v) } } }Pengguna lain dapat mengunduh file menggunakan URL pra-tandatangan untuk permintaan GET.
curl
curl -SO "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"Java
import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class Demo { public static void main(String[] args) { // Tentukan URL pra-tandatangan 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 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 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 pra-tandatangan ada dalam dokumen. link.click(); // Klik URL pra-tandatangan untuk mensimulasikan unduhan objek. link.remove(); // Hapus URL pra-tandatangan 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 pra-tandatangan 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
Referensi
Untuk kode contoh lengkap yang digunakan untuk mengunduh objek menggunakan URL pra-tandatangan, lihat Contoh GitHub.
Untuk informasi lebih lanjut tentang operasi API yang dapat Anda panggil untuk mengunduh objek menggunakan URL pra-tandatangan, lihat Presign.