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 .NET SDK untuk menghasilkan URL yang ditandatangani yang memungkinkan permintaan HTTP GET dengan waktu kedaluwarsa untuk memberikan akses sementara kepada orang lain guna mengunduh objek. Pengguna dapat mengunduh objek berulang kali selama periode validitas. Setelah periode validitas berakhir, pengguna harus mendapatkan URL yang ditandatangani baru.
Pertimbangan
Dalam topik ini, Titik akhir publik wilayah Tiongkok (Hangzhou) digunakan. Untuk mengakses OSS dari layanan Alibaba Cloud lainnya di wilayah yang sama, gunakan Titik akhir internal. Untuk detail tentang wilayah dan titik akhir yang didukung, lihat Wilayah dan titik akhir OSS.
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 tertentu 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 Versi Tanda Tangan 4 (direkomendasikan).
Jika URL yang ditandatangani yang dihasilkan oleh contoh berikut berisi karakter khusus
+, Anda mungkin tidak dapat mengakses URL yang ditandatangani. Untuk mengakses URL yang ditandatangani, ganti+dalam URL yang ditandatangani dengan%2B.Untuk menghasilkan URL yang ditandatangani yang menggunakan protokol HTTPS, atur protokol dalam titik akhir ke HTTPS.
Proses
Bagan alir berikut menunjukkan cara mengunduh objek menggunakan URL yang ditandatangani.
Hasilkan URL yang ditandatangani dan gunakan URL yang ditandatangani untuk mengunduh objek
Hasilkan URL yang ditandatangani.
using Aliyun.OSS; using Aliyun.OSS.Common; // Tentukan titik akhir wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. var endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Dapatkan kredensial dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET"); // Tentukan nama bucket. Contoh: examplebucket. var bucketName = "examplebucket"; // Tentukan jalur lengkap objek. Jalur lengkap tidak boleh berisi nama bucket. Contoh: exampledir/exampleobject.txt. var objectName = "exampledir/exampleobject.txt"; // Tentukan wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah ke cn-hangzhou. const string region = "cn-hangzhou"; // Buat instance ClientConfiguration dan modifikasi parameter default berdasarkan kebutuhan Anda. var conf = new ClientConfiguration(); // Tentukan tanda tangan V4. conf.SignatureVersion = SignatureVersion.V4; // Buat instance OSSClient. var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf); client.SetRegion(region); try { var metadata = client.GetObjectMetadata(bucketName, objectName); var etag = metadata.ETag; // Hasilkan URL yang ditandatangani. var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get) { // Atur periode validitas URL yang ditandatangani. Nilai default: 3600. Unit: detik. Expiration = DateTime.UtcNow.AddHours(1), }; var uri = client.GeneratePresignedUri(req); // Cetak URL yang ditandatangani yang dihasilkan Console.WriteLine("Generated Signed URL: " + uri); } catch (OssException ex) { Console.WriteLine("Gagal dengan kode kesalahan: {0}; Info kesalahan: {1}. \nRequestID:{2}\tHostID:{3}", ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId); } catch (Exception ex) { Console.WriteLine("Gagal dengan info kesalahan: {0}", ex.Message); }Kode sampel berikut memberikan contoh cara menggunakan URL yang ditandatangani 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 yang ditandatangani 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 tanggapan. 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 jenis tanggapan 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 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; }