Secara default, objek di bucket Object Storage Service (OSS) bersifat pribadi dan hanya dapat diakses oleh pemilik objek. Topik ini menjelaskan cara menggunakan OSS PHP SDK untuk menghasilkan URL yang ditandatangani untuk permintaan GET. URL tersebut berlaku selama periode tertentu dan memungkinkan pengguna lain mengunduh objek secara sementara. URL ini dapat diakses beberapa kali sebelum kedaluwarsa. Setelah kedaluwarsa, Anda harus menghasilkan URL baru.
Catatan
Kode contoh dalam topik ini menggunakan ID Wilayah China (Hangzhou),
cn-hangzhou, sebagai contoh. Secara default, ia menggunakan titik akhir publik. 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.Topik ini menggunakan variabel lingkungan untuk mendapatkan kredensial akses sebagai contoh. Untuk lebih banyak contoh tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan Kredensial Akses untuk PHP.
Anda tidak memerlukan izin khusus untuk menghasilkan URL yang ditandatangani. Namun, pihak ketiga hanya dapat berhasil mengunduh objek menggunakan URL yang ditandatangani jika Anda memiliki izin
oss:GetObject. Untuk informasi lebih lanjut tentang cara memberikan izin, lihat Berikan Kebijakan Akses Kustom kepada Pengguna RAM.Kode contoh dalam topik ini menggunakan URL yang ditandatangani V4, yang berlaku maksimal selama 7 hari. Untuk informasi lebih lanjut, lihat Signature V4 (Disarankan).
Proses
Bagan alir berikut menunjukkan cara mengunduh objek menggunakan URL yang ditandatangani.
Parameter
Parameter | Diperlukan | Deskripsi | Contoh |
| Ya | Wilayah tempat bucket berada. |
|
| Ya | Nama bucket. |
|
| Ya | Nama objek, termasuk jalur. |
|
| Tidak | Waktu kedaluwarsa dalam detik. Default: 900. |
|
| Tidak | Titik akhir. Jika tidak ditentukan, sistem secara otomatis menggunakan titik akhir publik yang sesuai berdasarkan wilayah. |
|
Kode contoh
Pemilik objek menghasilkan URL yang ditandatangani untuk permintaan GET.
<?php // Impor file autoloader untuk memastikan bahwa library dependensi dimuat dengan benar. require_once __DIR__ . '/../../vendor/autoload.php'; use AlibabaCloud\Oss\V2 as Oss; // Tentukan deskripsi untuk argumen baris perintah. $optsdesc = [ "region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. (Diperlukan) "endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Titik akhir untuk mengakses OSS. (Opsional) "bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. (Diperlukan) "key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. (Diperlukan) "expire" => ['help' => 'Waktu kedaluwarsa dalam detik (default: 900)', 'required' => False], // Waktu kedaluwarsa dalam detik. (Opsional, default: 900) ]; // Konversi deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt. // Tanda titik dua ":" setelah setiap argumen menunjukkan bahwa ia memerlukan nilai. $longopts = \array_map(function ($key) { return "$key:"; }, array_keys($optsdesc)); // Mengurai argumen baris perintah. $options = getopt("", $longopts); // Periksa apakah semua argumen yang diperlukan telah diberikan. foreach ($optsdesc as $key => $value) { if ($value['required'] === True && empty($options[$key])) { $help = $value['help']; // Dapatkan informasi bantuan untuk argumen tersebut. echo "Error: argumen berikut diperlukan: --$key, $help" . PHP_EOL; exit(1); // Jika argumen yang diperlukan tidak ada, keluar dari program. } } // Ekstrak nilai dari argumen yang diurai. $region = $options["region"]; // Wilayah tempat bucket berada. $bucket = $options["bucket"]; // Nama bucket. $key = $options["key"]; // Nama objek. $expire = isset($options["expire"]) ? (int)$options["expire"] : 900; // Waktu kedaluwarsa. Default: 900 detik. // Muat kredensial dari variabel lingkungan. // Gunakan EnvironmentVariableCredentialsProvider untuk membaca Access Key ID dan Access Key Secret dari variabel lingkungan. $credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider(); // Gunakan konfigurasi default dari SDK. $cfg = Oss\Config::loadDefault(); $cfg->setCredentialsProvider($credentialsProvider); // Setel penyedia kredensial. $cfg->setRegion($region); // Setel wilayah tempat bucket berada. if (isset($options["endpoint"])) { $cfg->setEndpoint($options["endpoint"]); // Jika titik akhir diberikan, setel itu. } try { // Buat instans klien OSS. $client = new Oss\Client($cfg); // Buat objek GetObjectRequest untuk mengunduh objek. $request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key); // Panggil metode presign untuk menghasilkan URL yang ditandatangani dan atur waktu kedaluwarsa. $result = $client->presign($request, [ 'expires' => new \DateInterval("PT{$expire}S") // PT berarti Period Time, dan S berarti detik. ]); // Keluarkan URL yang ditandatangani. echo "Signed URL: " . $result->url . PHP_EOL; } catch (Exception $e) { echo "Error: " . $e->getMessage() . PHP_EOL; exit(1); }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 telah 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 akan 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 pengunduhan: " + 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 menjawab 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(`Pengunduhan gagal. Server merespons dengan kode: ${response.statusCode}`); } }).on('error', (err) => { console.error("Kesalahan selama pengunduhan:", 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 menjawab dengan kode HTTP: {response.status_code}") except Exception as e: print("Kesalahan selama pengunduhan:", 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 menjawab 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 menjawab dengan kode HTTP: ${response.status}`); } return response.blob(); // Ubah tipe 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 pengunduhan:", 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 menjawab dengan kode HTTP: " + responseCode; } } catch (Exception e) { return "Kesalahan selama pengunduhan: " + e.getMessage(); } } }Objective-C
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // Tentukan URL yang telah 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 pengunduhan: %@", 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 untuk menghasilkan URL yang ditandatangani, lihat Contoh GitHub.
Untuk informasi lebih lanjut tentang operasi API Presign, lihat Presign.