Secara default, objek dalam bucket Object Storage Service (OSS) bersifat privat dan hanya dapat diakses oleh pemiliknya. Anda dapat menggunakan OSS PHP Software Development Kit (SDK) untuk menghasilkan URL yang ditandatangani untuk permintaan GET. URL tersebut memiliki masa berlaku tertentu dan memungkinkan pengguna lain mengunduh objek secara sementara. URL ini dapat diakses beberapa kali sebelum kedaluwarsa. Setelah masa berlaku habis, Anda harus membuat URL baru.
Catatan
Topik ini menggunakan endpoint publik wilayah China (Hangzhou). Untuk mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan endpoint internal. Untuk informasi selengkapnya mengenai wilayah dan endpoint yang didukung, lihat Wilayah dan titik akhir.
Topik ini memberikan contoh cara memperoleh kredensial akses dari variabel lingkungan. Untuk informasi selengkapnya tentang konfigurasi kredensial akses, lihat Konfigurasikan kredensial akses (PHP SDK V1).
Untuk menghasilkan URL yang ditandatangani untuk permintaan GET, Anda harus memiliki izin
oss:GetObject. Untuk informasi selengkapnya, lihat Berikan kebijakan akses kustom kepada RAM user.Topik ini menggunakan contoh URL yang ditandatangani versi V4. Masa berlaku maksimum adalah 7 hari. Untuk informasi selengkapnya, lihat Signature Version 4 (disarankan).
Jika URL yang ditandatangani yang dihasilkan dari contoh berikut mengandung tanda plus (
+), Anda mungkin tidak dapat mengakses URL tersebut. Untuk mengaksesnya, ganti tanda+dengan%2B.Untuk menghasilkan URL yang ditandatangani menggunakan protokol HTTPS, atur protokol komunikasi pada Endpoint ke HTTPS.
Proses
Langkah-langkah berikut menjelaskan cara menggunakan URL yang ditandatangani untuk mengunduh objek:
Contoh kode
Pemilik objek menghasilkan URL yang ditandatangani untuk permintaan GET.
<?php if (is_file(__DIR__ . '/../autoload.php')) { require_once __DIR__ . '/../autoload.php'; } if (is_file(__DIR__ . '/../vendor/autoload.php')) { require_once __DIR__ . '/../vendor/autoload.php'; } use OSS\OssClient; use OSS\Core\OssException; use OSS\Http\RequestCore; use OSS\Http\ResponseCore; use OSS\Credentials\EnvironmentVariableCredentialsProvider; // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. $provider = new EnvironmentVariableCredentialsProvider(); // Atur yourEndpoint ke Titik Akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Titik Akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. $endpoint = "yourEndpoint"; // Tentukan nama bucket. $bucket= "examplebucket"; // Tentukan jalur lengkap objek. Jangan sertakan nama bucket. $object = "exampleobject.txt"; // Atur waktu kedaluwarsa URL yang ditandatangani menjadi 600 detik. Nilai maksimum adalah 32400 detik. $timeout = 600; try { $config = array( "provider" => $provider, "endpoint" => $endpoint, 'signatureVersion'=>OssClient::OSS_SIGNATURE_VERSION_V4, "region"=> "cn-hangzhou" ); $ossClient = new OssClient($config); // Hasilkan URL yang ditandatangani. $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET"); print_r($signedUrl); } catch (OssException $e) { printf(__FUNCTION__ . ": GAGAL\n"); printf($e->getMessage() . "\n"); return; }Pengguna lain menggunakan URL yang ditandatangani tersebut untuk permintaan GET guna 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"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 URL dengan URL yang ditandatangani 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"; // Tentukan jalur tujuan untuk menyimpan file, termasuk nama file dan ekstensinya. String savePath = "C:/downloads/myfile.txt"; try { downloadFile(fileURL, savePath); System.out.println("Pengunduhan selesai!"); } catch (IOException e) { System.err.println("Terjadi error 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"; 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 error 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********" 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 error 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********" 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"; const savePath = "C:/downloads/myfile.txt"; // Nama file yang akan digunakan saat file diunduh. 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; // Atur 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 pengunduhan selesai. console.log("Pengunduhan selesai!"); }) .catch(error => { console.error("Terjadi error 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 error 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 jalur 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=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"; NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // Ganti your_username 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) { // Tangani error. if (error) { NSLog(@"Terjadi error 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 error saat menyimpan file: %@", writeError.localizedDescription); } }]; // Mulai tugas. [task resume]; // Pertahankan thread utama agar permintaan asinkron dapat diselesaikan. [[NSRunLoop currentRunLoop] run]; } return 0; }