Secara default, objek dalam bucket Object Storage Service (OSS) bersifat privat. Hanya pemilik objek yang dapat mengaksesnya. Anda dapat menggunakan OSS SDK untuk Java guna menghasilkan URL yang ditandatangani sebelumnya untuk permintaan GET. URL ini mencakup waktu kedaluwarsa dan memungkinkan pihak lain untuk sementara mengunduh objek tersebut. URL tersebut dapat digunakan beberapa kali selama periode validitasnya. Setelah URL kedaluwarsa, Anda harus membuat URL baru.
Pertimbangan
Pada topik ini, titik akhir publik wilayah China (Hangzhou) digunakan. Untuk mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan titik akhir internal. Untuk detail tentang wilayah dan titik akhir yang didukung, lihat Wilayah dan titik akhir.
Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.
Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Contoh konfigurasi untuk skenario umum.
Anda tidak memerlukan izin untuk menghasilkan URL yang ditandatangani sebelumnya. Namun, agar pihak ketiga dapat mengunduh objek menggunakan URL tersebut, pengguna yang menghasilkan URL harus memiliki izin
oss:GetObject. Untuk informasi selengkapnya tentang cara memberikan izin, lihat Berikan izin kustom kepada RAM user.Topik ini menggunakan contoh URL yang ditandatangani sebelumnya versi V4. Periode validitas maksimum adalah tujuh hari. Untuk informasi selengkapnya, lihat Signature Version 4 (Direkomendasikan).
Prosedur
Prosedur berikut menjelaskan cara mengunduh objek menggunakan URL yang ditandatangani sebelumnya:
Contoh kode
Pemilik objek menghasilkan URL yang ditandatangani sebelumnya untuk permintaan GET.
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import java.net.URL; import java.util.Date; public class Demo { public static void main(String[] args) throws Throwable { // Contoh ini menggunakan titik akhir publik wilayah China (Hangzhou). Tentukan titik akhir yang sebenarnya. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Masukkan nama bucket. Misalnya, examplebucket. String bucketName = "examplebucket"; // Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh mengandung nama bucket. String objectName = "exampleobject.txt"; // Masukkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel Region ke cn-hangzhou. String region = "cn-hangzhou"; // Buat instans OSSClient. // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Tetapkan waktu kedaluwarsa URL yang ditandatangani sebelumnya dalam milidetik. Contoh ini menetapkan waktu kedaluwarsa selama satu jam. Date expiration = new Date(new Date().getTime() + 3600 * 1000L); // Hasilkan URL yang ditandatangani sebelumnya untuk permintaan GET. Contoh ini tidak menyertakan header permintaan tambahan. Pengguna lain dapat langsung mengakses konten melalui browser. URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration); System.out.println(url); } catch (OSSException oe) { System.out.println("Terjadi OSSException, yang berarti permintaan Anda sampai ke OSS, " + "tetapi ditolak dengan tanggapan error karena suatu alasan."); System.out.println("Pesan Error:" + oe.getErrorMessage()); System.out.println("Kode Error:" + oe.getErrorCode()); System.out.println("ID Permintaan:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Terjadi ClientException, yang berarti klien mengalami " + "masalah internal serius saat mencoba berkomunikasi dengan OSS, " + "seperti tidak dapat mengakses jaringan."); System.out.println("Pesan Error:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }Pengguna lain mengunduh objek menggunakan URL yang ditandatangani sebelumnya.
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) { // Ganti dengan URL yang ditandatangani sebelumnya 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; // Masukkan jalur tujuan untuk menyimpan file, termasuk nama file dan ekstensi. String savePath = "C:/downloads/myfile.txt"; try { downloadFile(fileURL, savePath); System.out.println("Pengunduhan selesai!"); } catch (IOException e) { System.err.println("Terjadi kesalahan 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=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("Pengunduhan selesai!"); }); } else { console.error(`Pengunduhan gagal. Server merespons dengan kode: ${response.statusCode}`); } }).on('error', (err) => { console.error("Terjadi kesalahan 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=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("Pengunduhan selesai!") else: print(f"Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: {response.status_code}") except Exception as e: print("Terjadi kesalahan 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=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("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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; const savePath = "C:/downloads/myfile.txt"; // Nama file yang akan digunakan untuk pengunduhan. 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; // Tetapkan 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 selesai. console.log("Pengunduhan selesai!"); }) .catch(error => { console.error("Terjadi kesalahan 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 kesalahan 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 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // Ganti 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) { // Penanganan kesalahan. if (error) { NSLog(@"Terjadi kesalahan 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 kesalahan saat menyimpan file: %@", writeError.localizedDescription); } }]; // Mulai tugas. [task resume]; // Pertahankan thread utama agar permintaan asinkron dapat diselesaikan. [[NSRunLoop currentRunLoop] run]; } return 0; }
Skema lainnya
Hasilkan URL yang ditandatangani sebelumnya untuk versi file tertentu
Gunakan nama domain kustom untuk menghasilkan URL yang ditandatangani sebelumnya guna pengunduhan
Hasilkan URL yang ditandatangani sebelumnya untuk memaksa pengunduhan
Referensi
Untuk kode contoh lengkap tentang mengunduh objek menggunakan URL yang ditandatangani sebelumnya, lihat contoh GitHub.
Untuk informasi selengkapnya tentang operasi API yang digunakan untuk menghasilkan URL yang ditandatangani sebelumnya, lihat GeneratePresignedUrlRequest.