Secara default, objek dalam bucket Object Storage Service (OSS) bersifat pribadi dan hanya dapat diakses oleh pemilik objek. Topik ini menjelaskan cara menggunakan OSS C# SDK untuk menghasilkan URL yang ditandatangani untuk permintaan GET. URL tersebut mencakup waktu kedaluwarsa untuk memberikan akses unduhan sementara kepada pengguna lain. URL tersebut dapat diakses beberapa kali sebelum kedaluwarsa. Setelah URL kedaluwarsa, Anda harus menghasilkan yang baru.
Peringatan
Kode contoh dalam topik ini menggunakan wilayah China (Hangzhou) sebagai contoh. ID wilayahnya adalah
cn-hangzhou. Secara default, titik akhir publik digunakan. Jika Anda ingin mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir yang didukung oleh OSS, lihat Wilayah dan Titik Akhir.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.
Proses
Bagan alir berikut menunjukkan cara mengunduh objek menggunakan URL yang ditandatangani.
Kode contoh
Pemilik objek menghasilkan URL yang ditandatangani untuk permintaan GET.
using OSS = AlibabaCloud.OSS.V2; // Buat alias untuk Alibaba Cloud OSS SDK untuk menyederhanakan penggunaan selanjutnya. var region = "cn-hangzhou"; // Diperlukan. Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah menjadi cn-hangzhou. var endpoint = null as string; // Opsional. Tentukan titik akhir yang digunakan untuk mengakses OSS. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. var bucket = "nama bucket Anda"; // Diperlukan. Nama bucket. var key = "nama objek Anda"; // Diperlukan. Nama objek yang ingin Anda hasilkan URL yang ditandatangani. // Muat konfigurasi default dari SDK OSS. Konfigurasi secara otomatis membaca informasi kredensial (seperti AccessKey) dari variabel lingkungan. var cfg = OSS.Configuration.LoadDefault(); // Secara eksplisit atur penggunaan variabel lingkungan untuk mendapatkan kredensial untuk verifikasi identitas (format: OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET). cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider(); // Atur wilayah bucket dalam konfigurasi. cfg.Region = region; // Jika titik akhir ditentukan, itu akan menimpa titik akhir default. if(endpoint != null) { cfg.Endpoint = endpoint; } // Buat instans Klien OSS menggunakan informasi konfigurasi. using var client = new OSS.Client(cfg); // Panggil metode Presign untuk menghasilkan URL yang ditandatangani. var result = client.Presign(new OSS.Models.GetObjectRequest() { Bucket = bucket, Key = key, }); using var hc = new HttpClient(); // Gunakan HttpClient untuk mengirim permintaan HTTP untuk mendapatkan konten objek. var httpResult = await hc.GetAsync(result.Url); // Kirim permintaan GET ke URL yang ditandatangani. var stream = await httpResult.Content.ReadAsStreamAsync(); // Baca konten respons sebagai aliran. using var reader = new StreamReader(stream); // Gunakan StreamReader untuk mengonversi aliran menjadi string. var got = await reader.ReadToEndAsync(); // Cetak pesan yang menunjukkan bahwa operasi selesai. Console.WriteLine("GetObject selesai"); Console.WriteLine($"KodeStatus: {httpResult.StatusCode}"); //Kode status HTTP dari respons.Pengguna lain mengunduh objek menggunakan URL yang ditandatangani untuk permintaan GET.
curl
curl -SO "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"Java
import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class Demo { public static void main(String[] args) { // Tentukan URL yang 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 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 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.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 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 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; }
Referensi
Untuk kode contoh lengkap yang digunakan untuk mengunduh objek menggunakan URL yang ditandatangani, lihat PresignGetObject.cs.