Objek OSS bersifat privat secara default dan hanya pemilik file yang dapat mengaksesnya. Namun, pemilik file dapat menghasilkan tautan bersama (URL yang ditandatangani sebelumnya) untuk memberikan otorisasi kepada pihak lain agar dapat mengunduh atau meninjau file tertentu secara online dalam periode validitas tertentu.
Audience yang dituju: pengguna yang perlu membagikan objek OSS (file) dengan pihak ketiga secara cepat, serta pihak ketiga yang menerima URL tersebut. Ini mencakup pengguna baru OSS maupun pengguna teknis seperti developer dan engineer O&M.
Tujuan: membantu pengguna di semua tingkatan menghasilkan URL yang ditandatangani sebelumnya sesuai kebutuhan mereka agar dapat diakses sebagaimana mestinya, serta membantu pihak ketiga menggunakan URL tersebut untuk mengakses sumber daya.
Cara kerja
Pembuatan URL yang ditandatangani sebelumnya bergantung pada enkripsi kunci rahasia dan penggabungan parameter. Prosesnya sebagai berikut:
-
Verifikasi izin: Saat membuat URL yang ditandatangani sebelumnya, Anda harus memiliki izin
oss:GetObjectagar pihak ketiga berhasil mengunduh/meninjau file melalui URL tersebut. -
Enkripsi lokal: Berdasarkan AK/SK, lakukan enkripsi dan hitung path file, waktu kedaluwarsa, serta informasi lainnya untuk mendapatkan signature (
x-oss-signature). -
Tambahkan signature: Tambahkan parameter signature (
x-oss-date,x-oss-expires,x-oss-credential, dll.) sebagai query string ke URL file. -
Bentuk tautan: Susun URL lengkap yang ditandatangani sebelumnya.
Format URL yang ditandatangani sebelumnya
https://BucketName.Endpoint/Object?signature parametersContoh lengkap
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-process=image%2Fresize%2Cp_10&x-oss-date=20241115T095058Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241115%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6e7a*********************************
Untuk proses pembuatan detail, lihat Signature Version 4 (Direkomendasikan).
Dapatkan tautan unduh file
Gunakan endpoint default OSS untuk menghasilkan tautan unduh file dengan tanggal kedaluwarsa (URL yang ditandatangani sebelumnya).
Menggunakan Konsol OSS
Login ke Konsol Manajemen OSS, buka daftar Files bucket target, klik file target, lalu klik Copy File URL di panel detail sebelah kanan untuk mendapatkan tautan unduh sementara dengan periode validitas default 300 detik (5 menit).
Menggunakan Alibaba Cloud SDK
Berikut adalah contoh kode untuk menghasilkan tautan unduh file (URL yang ditandatangani sebelumnya) dalam berbagai bahasa pemrograman.
Java
Untuk informasi lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di Java.
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 Tiongkok (Hangzhou). Tentukan titik akhir yang aktual.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Masukkan nama bucket. Misalnya, examplebucket.
String bucketName = "examplebucket";
// Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh berisi nama bucket.
String objectName = "exampleobject.txt";
// Masukkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur 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 {
// Atur waktu kedaluwarsa URL yang ditandatangani dalam milidetik. Contoh ini mengatur waktu kedaluwarsa menjadi satu jam.
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// Buat URL yang ditandatangani 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("Menangkap OSSException, yang berarti permintaan Anda berhasil sampai ke OSS, "
+ "tetapi ditolak dengan tanggapan error karena alasan tertentu.");
System.out.println("Pesan Error:" + oe.getErrorMessage());
System.out.println("Kode Error:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("ID Host:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Menangkap ClientException, yang berarti klien mengalami "
+ "masalah internal yang serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Error:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}Python
Untuk informasi lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di Python.
import argparse
import alibabacloud_oss_v2 as oss
# Buat parser parameter baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="sampel presign get object")
# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib diisi.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib diisi.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib diisi.
parser.add_argument('--key', help='Nama objek.', required=True)
def main():
# Urai parameter baris perintah untuk mendapatkan nilai yang ditentukan.
args = parser.parse_args()
# Dari variabel lingkungan, muat informasi otentikasi yang diperlukan untuk mengakses OSS.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Gunakan konfigurasi default untuk membuat objek cfg dan menentukan penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Atur atribut wilayah objek cfg ke wilayah yang disediakan di baris perintah.
cfg.region = args.region
# Jika titik akhir kustom disediakan, perbarui atribut titik akhir objek cfg dengan titik akhir yang disediakan.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Gunakan pengaturan sebelumnya untuk menginisialisasi instans OSSClient.
client = oss.Client(cfg)
# Mulai permintaan untuk menghasilkan URL yang ditandatangani.
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # Tentukan nama bucket.
key=args.key, # Tentukan kunci objek.
)
)
# Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani.
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}'
)
# Tampilkan header yang ditandatangani.
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
# Panggil fungsi main untuk memulai logika pemrosesan saat skrip dijalankan secara langsung.
if __name__ == "__main__":
main() # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.Go
Untuk informasi lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di Go.
package main
import (
"context"
"flag"
"log"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// Mendefinisikan variabel global.
var (
region string // Wilayah tempat bucket berada.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Urai parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Periksa apakah wilayah kosong.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat URL yang telah ditandatangani untuk permintaan GetObject.
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("failed to get object presign %v", err)
}
log.Printf("request method:%v\n", result.Method)
log.Printf("request expiration:%v\n", result.Expiration)
log.Printf("request url:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// Jika hasil yang dikembalikan berisi header yang ditandatangani, Anda harus menyertakan header permintaan yang sesuai saat Anda mengirim permintaan GET menggunakan URL yang telah ditandatangani. Jika tidak, permintaan mungkin gagal atau terjadi kesalahan tanda tangan.
log.Printf("signed headers:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Node.js
Untuk informasi lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di Node.js.
const OSS = require("ali-oss");
// Definisikan fungsi untuk menghasilkan URL yang ditandatangani.
async function generateSignatureUrl(fileName) {
// Dapatkan URL yang ditandatangani.
const client = await new OSS({
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// Ganti yourregion dengan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Wilayah ke oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
// Atur secure ke true untuk menggunakan HTTPS. Ini mencegah browser memblokir tautan unduhan yang dihasilkan.
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // Atur header permintaan berdasarkan header permintaan yang sebenarnya.
}, fileName);
}
// Panggil fungsi dan teruskan nama file.
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});PHP
Untuk informasi lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di PHP.
<?php
// Impor file autoloader untuk memastikan library dependensi dimuat dengan benar.
require_once __DIR__ . '/../../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// Definisikan deskripsi untuk argumen baris perintah.
$optsdesc = [
"region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. (Wajib)
"endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Endpoint untuk mengakses OSS. (Opsional)
"bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. (Wajib)
"key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. (Wajib)
"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 dibutuhkan oleh getopt.
// Titik dua ":" setelah setiap argumen menunjukkan bahwa argumen tersebut memerlukan nilai.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Parsing argumen baris perintah.
$options = getopt("", $longopts);
// Periksa apakah semua argumen wajib disediakan.
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 wajib: --$key, $help" . PHP_EOL;
exit(1); // Jika argumen wajib hilang, keluar dari program.
}
}
// Ekstrak nilai dari argumen yang diparsing.
$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 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 endpoint disediakan, setel itu.
}
try {
// Buat instance 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 setel 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);
}.NET
Untuk informasi lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di .NET.
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (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 Anda 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. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instans ClientConfiguration dan ubah parameter default berdasarkan kebutuhan Anda.
var conf = new ClientConfiguration();
// Tentukan tanda tangan V4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instans 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 telah ditandatangani.
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// Atur periode validitas URL yang telah ditandatangani. Nilai default: 3600. Satuan: detik.
Expiration = DateTime.UtcNow.AddHours(1),
};
var uri = client.GeneratePresignedUri(req);
// Cetak URL yang telah ditandatangani yang dihasilkan
Console.WriteLine("Generated Signed URL: " + uri);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}Android
Untuk informasi SDK lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di Android.
// Tentukan nama bucket, misalnya examplebucket.
String bucketName = "examplebucket";
// Tentukan path lengkap objek sumber, tanpa nama bucket, misalnya exampleobject.txt.
String objectKey = "exampleobject.txt";
String url = null;
try {
// Hasilkan URL yang ditandatangani sebelumnya untuk mengunduh file.
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// Setel waktu kedaluwarsa URL yang ditandatangani sebelumnya menjadi 30 menit.
request.setExpiration(30*60);
request.setMethod(HttpMethod.GET);
url = oss.presignConstrainedObjectURL(request);
Log.d("url", url);
} catch (ClientException e) {
e.printStackTrace();
}iOS
Untuk informasi SDK lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di iOS.
// Tentukan nama bucket.
NSString *bucketName = @"examplebucket";
// Tentukan nama objek.
NSString *objectKey = @"exampleobject.txt";
__block NSString *urlString;
// Buat URL yang ditandatangani dengan periode validitas untuk mengunduh objek. Dalam contoh ini, periode validitas URL adalah 30 menit.
OSSTask *task = [client presignConstrainURLWithBucketName:bucketName
withObjectKey:objectKey
httpMethod:@"GET"
withExpirationInterval:30 * 60
withParameters:@{}];
[task continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (task.error) {
NSLog(@"presign error: %@", task.error);
} else {
urlString = task.result;
NSLog(@"url: %@", urlString);
}
return nil;
}];C++
Untuk informasi SDK lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di C++.
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Lakukan inisialisasi informasi tentang akun yang digunakan untuk mengakses OSS. */
/* Tentukan titik akhir wilayah tempat bucket berada. Contohnya, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Contohnya, jika bucket berada di wilayah China (Hangzhou), atur wilayah ke cn-hangzhou. * /
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt. */
std::string GetobjectUrlName = "exampledir/exampleobject.txt";
/* Lakukan inisialisasi sumber daya, seperti sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Tentukan periode validitas URL pra-tanda tangan. Periode validitas maksimum adalah 32.400. Unit: detik. */
std::time_t t = std::time(nullptr) + 1200;
/* Buat URL pra-tanda tangan. */
auto genOutcome = client.GeneratePresignedUrl(BucketName, GetobjectUrlName, t, Http::Get);
if (genOutcome.isSuccess()) {
std::cout << "GeneratePresignedUrl success, Gen url:" << genOutcome.result().c_str() << std::endl;
}
else {
/* Tangani pengecualian. */
std::cout << "GeneratePresignedUrl fail" <<
",code:" << genOutcome.error().Code() <<
",message:" << genOutcome.error().Message() <<
",requestId:" << genOutcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya, seperti sumber daya jaringan. */
ShutdownSdk();
return 0;
}Ruby
Untuk informasi SDK lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di Ruby.
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Titik akhir China (Hangzhou) digunakan sebagai contoh. Tentukan titik akhir berdasarkan wilayah Anda yang sebenarnya.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan contoh kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Tentukan nama bucket. Misalnya, examplebucket.
bucket = client.get_bucket('examplebucket')
# Buat URL yang ditandatangani dan atur periode validitasnya menjadi 1 jam (3600 detik).
puts bucket.object_url('my-object', true, 3600)C
Untuk informasi SDK lebih lanjut, lihat Unduh file menggunakan URL yang ditandatangani sebelumnya di C.
#include "oss_api.h"
#include "aos_http_io.h"
/* Setel yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Misalnya, examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan path lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Inisialisasi tipe aos_string_t dengan string char*. */
aos_str_set(&options->config->endpoint, endpoint);
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
/* Tentukan apakah akan menggunakan CNAME untuk mengakses OSS. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Setel parameter jaringan, seperti periode timeout. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Panggil metode aos_http_io_initialize di entri program untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* Pool memori (pool) untuk manajemen memori, yang setara dengan apr_pool_t. Kode implementasinya ada di library APR. */
aos_pool_t *pool;
/* Buat pool memori baru. Parameter kedua adalah NULL, yang menunjukkan bahwa pool tidak mewarisi dari pool memori lain. */
aos_pool_create(&pool, NULL);
/* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
oss_request_options_t *oss_client_options;
/* Alokasikan memori untuk opsi dalam pool memori. */
oss_client_options = oss_request_options_create(pool);
/* Inisialisasi opsi klien oss_client_options. */
init_options(oss_client_options);
/* Inisialisasi parameter. */
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_http_request_t *req;
apr_time_t now;
char *url_str;
aos_string_t url;
int64_t expire_time;
int one_hour = 3600;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
expire_time = now / 1000000 + one_hour;
req = aos_http_request_create(pool);
req->method = HTTP_GET;
now = apr_time_now();
/* Satuan: mikrodetik. */
expire_time = now / 1000000 + one_hour;
/* Hasilkan URL yang ditandatangani sebelumnya. */
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
aos_str_set(&url, url_str);
printf("Temporary download URL: %s\n", url_str);
/* Lepaskan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai sumber daya selama permintaan. */
aos_pool_destroy(pool);
/* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
aos_http_io_deinitialize();
return 0;
}Contoh URL yang ditandatangani sebelumnya yang dihasilkan adalah sebagai berikut:
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-process=image%2Fresize%2Cp_10&x-oss-date=20241115T095058Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************%2F20241115%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6e7a*********************************************
Menggunakan alat baris perintah ossutil
Untuk objek example.txt di bucket examplebucket, hasilkan tautan unduh file (URL yang ditandatangani sebelumnya) dengan periode validitas default 15 menit menggunakan perintah berikut.
ossutil presign oss://examplebucket/example.txt
Untuk contoh lebih lanjut penggunaan ossutil untuk menghasilkan URL yang ditandatangani sebelumnya, lihat presign (Hasilkan URL yang ditandatangani sebelumnya).
Menggunakan alat manajemen grafis ossbrowser
ossbrowser mendukung operasi tingkat objek yang serupa dengan yang tersedia di Konsol. Ikuti antarmuka ossbrowser untuk menghasilkan URL yang ditandatangani. Untuk informasi selengkapnya tentang penggunaan ossbrowser, lihat Operasi Umum.
Dapatkan tautan pratinjau online untuk file
Untuk menghasilkan tautan yang mendukung pratinjau online (URL yang ditandatangani sebelumnya), Anda harus terlebih dahulu melampirkan nama domain kustom. Setelah melampirkan nama domain kustom, gunakan nama domain tersebut untuk menghasilkan URL yang ditandatangani sebelumnya.
Gunakan Konsol OSS
-
Login ke Konsol OSS.
-
Di panel navigasi kiri, klik Buckets. Di halaman Buckets, klik nama bucket.
-
Di pohon navigasi kiri, pilih .
-
Di halaman Objek, klik nama objek.
-
Di panel View Details, pilih nama domain kustom yang dipetakan ke bucket di bidang Custom Domain Name, pertahankan pengaturan default untuk parameter lain, lalu klik Copy Object URL.

Gunakan ossbrowser
Anda dapat menggunakan ossbrowser untuk melakukan operasi tingkat objek yang sama seperti yang dapat Anda lakukan di Konsol OSS. Anda dapat mengikuti petunjuk di layar di ossbrowser untuk mendapatkan URL yang ditandatangani sebelumnya. Untuk informasi tentang cara mengunduh ossbrowser, lihat ossbrowser 1.0.
-
Gunakan nama domain kustom untuk login ke ossbrowser.
-
Dapatkan URL objek.
Gunakan OSS SDK
Anda dapat menggunakan nama domain kustom untuk membuat instance OssClient dan menghasilkan URL yang ditandatangani sebelumnya.
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Throwable {
// Atur yourCustomEndpoint ke nama domain kustom Anda. Misalnya, http://static.example.com.
String endpoint = "yourCustomEndpoint";
// Masukkan informasi Wilayah bucket Anda, misalnya, cn-hangzhou.
String region = "cn-hangzhou";
// Masukkan nama bucket. Misalnya, examplebucket.
String bucketName = "examplebucket";
// Masukkan jalur lengkap objek. Misalnya, exampleobject.txt. Jalur lengkap tidak boleh berisi nama bucket.
String objectName = "exampleobject.txt";
// Dapatkan kredensial akses dari Variabel lingkungan. Sebelum Anda menjalankan kode ini, konfigurasikan Variabel lingkungan.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Buat Instans OSSClient.
// Saat Instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan Sumber daya.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Catatan: Atur ini ke true untuk mengaktifkan opsi Nama Domain CNAME.
clientBuilderConfiguration.setSupportCname(true);
// Deklarasikan penggunaan algoritma tanda tangan V4 secara eksplisit.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Atur waktu kedaluwarsa URL yang ditandatangani yang dibuat dalam milidetik. Contoh ini mengatur waktu kedaluwarsa menjadi satu jam.
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// Buat URL yang ditandatangani.
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
// Atur waktu kedaluwarsa.
request.setExpiration(expiration);
// Buat URL yang ditandatangani untuk permintaan HTTP GET.
URL signedUrl = ossClient.generatePresignedUrl(request);
// Cetak URL yang ditandatangani.
System.out.println("signed url for getObject: " + signedUrl);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
PHP
<?php
// Impor file autoloader untuk memastikan pustaka 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' => 'The region in which the bucket is located.', 'required' => True], // Wilayah tempat bucket berada. (Wajib)
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False], // Titik akhir untuk mengakses OSS. (Opsional)
"bucket" => ['help' => 'The name of the bucket', 'required' => True], // Nama bucket. (Wajib)
"key" => ['help' => 'The name of the object', 'required' => True], // Nama objek. (Wajib)
];
// Konversikan deskripsi argumen ke format opsi panjang yang diperlukan oleh getopt.
// Titik dua ":" setelah setiap argumen menunjukkan bahwa argumen tersebut memerlukan nilai.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Urai argumen baris perintah.
$options = getopt("", $longopts);
// Periksa apakah semua argumen yang diperlukan telah disediakan.
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // Dapatkan informasi bantuan untuk argumen tersebut.
echo "Error: the following arguments are required: --$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.
// Muat kredensial dari variabel lingkungan.
// Gunakan EnvironmentVariableCredentialsProvider untuk membaca ID AccessKey dan Access Key Secret dari variabel lingkungan.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// Gunakan konfigurasi default SDK.
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // Atur penyedia kredensial.
$cfg->setRegion($region); // Atur wilayah tempat bucket berada.
$cfg->setEndpoint(endpoint: "http://static.example.com"); // Atur ini ke titik akhir kustom Anda.
$cfg->setUseCname(true); // Atur untuk menggunakan Nama Domain CNAME.
// 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 membuat URL yang ditandatangani.
$result = $client->presign($request);
// Cetak hasil presign.
// Keluarkan URL yang ditandatangani, yang dapat digunakan pengguna secara langsung untuk mengunduh objek.
print(
'get object presign result:' . var_export($result, true) . PHP_EOL . // Informasi terperinci tentang hasil presign.
'get object url:' . $result->url . PHP_EOL // URL yang ditandatangani untuk mengunduh objek secara langsung.
);
Node.js
const OSS = require("ali-oss");
// Definisikan fungsi untuk membuat URL yang ditandatangani.
async function generateSignatureUrl(fileName) {
// Dapatkan URL yang ditandatangani.
const client = await new OSS({
// Gunakan nama domain kustom sebagai titik akhir.
endpoint: 'http://static.example.com',
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode ini, pastikan bahwa variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// Ganti yourregion dengan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Wilayah ke oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
authorizationV4: true,
cname: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // Atur header permintaan berdasarkan header permintaan yang sebenarnya.
}, fileName);
}
// Panggil fungsi dan teruskan nama file.
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});
Python
import argparse
import alibabacloud_oss_v2 as oss
# Buat parser parameter baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="contoh presign get object")
# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib diisi.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib diisi.
parser.add_argument('--bucket', help='Nama bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='Nama domain yang dapat digunakan layanan lain untuk mengakses OSS')
# Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib diisi.
parser.add_argument('--key', help='Nama objek.', required=True)
def main():
# Urai parameter baris perintah untuk mendapatkan nilai yang ditentukan.
args = parser.parse_args()
# Dari variabel lingkungan, muat informasi otentikasi yang diperlukan untuk mengakses OSS.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Gunakan konfigurasi default untuk membuat objek cfg dan tentukan penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Tentukan atribut wilayah objek konfigurasi berdasarkan parameter baris perintah yang ditentukan oleh pengguna.
cfg.region = args.region
# Tentukan titik akhir kustom. Contoh: http://static.example.com
cfg.endpoint = "http://static.example.com"
# Aktifkan resolusi rekaman CNAME.
cfg.use_cname = True
# Gunakan pengaturan sebelumnya untuk menginisialisasi instans OSSClient.
client = oss.Client(cfg)
# Mulai permintaan untuk membuat URL yang ditandatangani.
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # Tentukan nama bucket.
key=args.key, # Tentukan kunci objek.
)
)
# Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani.
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}'
)
# Tampilkan header yang ditandatangani.
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
# Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan secara langsung.
if __name__ == "__main__":
main() # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.
Go
package main
import (
"context"
"flag"
"log"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// Tentukan variabel global.
var (
region string // Wilayah tempat bucket berada.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Uraikan parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Periksa apakah wilayah kosong.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// Muat konfigurasi default dan tentukan penyedia kredensial serta wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region).
WithEndpoint("http://static.example.com").
WithUseCName(true)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Buat URL pra-tanda tangan untuk permintaan GetObject.
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
//RequestPayer: oss.Ptr("requester"), // Tentukan identitas pemohon.
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("failed to get object presign %v", err)
}
log.Printf("request method:%v\n", result.Method)
log.Printf("request expiration:%v\n", result.Expiration)
log.Printf("request url:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// Jika Anda menentukan header permintaan saat membuat URL pra-tanda tangan yang mengizinkan permintaan HTTP GET, pastikan header permintaan tersebut disertakan dalam permintaan GET yang diinisiasi menggunakan URL pra-tanda tangan itu. Hal ini mencegah kegagalan permintaan dan kesalahan tanda tangan.
log.Printf("signed headers:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Gunakan ossutil
Gunakan nama domain kustom untuk menghasilkan URL yang ditandatangani sebelumnya untuk objek dengan menjalankan perintah presign (hasilkan URL yang ditandatangani).
ossutil presign oss://examplebucket/exampleobject.txt --endpoint "http://static.example.com” --addressing-style "cname"
Untuk mengaktifkan perintah ossutil agar secara otomatis menggunakan nama domain kustom, alih-alih menentukannya secara manual setiap kali, tambahkan nama domain kustom ke file konfigurasi.
Jika tautan masih tidak dapat dipratinjau, periksa konfigurasi berikut.
-
Apakah
Content-Typediatur dengan tepat?Jika
Content-Typefile tidak sesuai dengan jenis aktualnya, browser mungkin tidak dapat mengidentifikasi dan merender konten dengan benar, menyebabkan file diunduh sebagai lampiran. Anda dapat memeriksa Cara mengatur Content-Type (MIME)? untuk mengonfirmasi apakah ekstensi nama file sesuai denganContent-Type. Jika tidak sesuai, lihat Kelola metadata objek untuk metode mengubahContent-Typefile. -
Apakah
Content-Dispositiondiatur keinline?Jika
Content-Dispositionfile diatur keattachment, browser akan memaksa file untuk diunduh. Lihat Kelola metadata objek untuk metode mengubahnya keinlineguna mendukung pratinjau. -
Apakah cache CDN telah direfresh?
Jika Anda tidak menggunakan akselerasi CDN, Anda dapat mengabaikan item ini.
Jika Anda menggunakan CDN untuk mengakses sumber daya OSS, Anda perlu merefresh cache CDN setelah memodifikasi metadata file. Jika tidak, konfigurasi lama mungkin masih dibaca, menyebabkan pratinjau tidak berlaku.
Dapatkan tautan unduh paksa untuk file
Jika tautan saat ini (URL yang ditandatangani sebelumnya) terbuka langsung untuk pratinjau di browser, tetapi Anda ingin file tersebut diunduh, Anda dapat menggunakan metode berikut. Metode 1 memiliki prioritas lebih tinggi daripada Metode 2.
Metode 1: Unduh paksa satu kali
Ini hanya berlaku untuk tautan yang saat ini dihasilkan. Terapkan ini dengan mengatur parameter response-content-disposition ke attachment saat menghasilkan URL.
Java
Impor kelas GeneratePresignedUrlRequest.
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
Gunakan metode GeneratePresignedUrlRequest dan atur header respons response-content-disposition ke attachment.
// Bangun URL yang ditandatangani sebelumnya untuk permintaan GET
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(
bucketName, objectName, HttpMethod.GET);
// Setel unduh paksa
request.getResponseHeaders().setContentDisposition("attachment");
Python
Tambahkan parameter response_content_disposition di GetObjectRequest dan atur nilainya ke attachment.
// Hasilkan permintaan GET yang ditandatangani sebelumnya
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, // Tentukan nama bucket
key=args.key, // Tentukan kunci objek
response_content_disposition="attachment",// Setel ke unduh paksa
)
)
Go
Tambahkan parameter ResponseContentDisposition di GetObjectRequest dan atur nilainya ke attachment.
// Hasilkan permintaan GET yang ditandatangani sebelumnya dengan perilaku unduh paksa
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment"), // Setel ke unduh paksa
})
Metode 2: Pengaturan unduh paksa universal (melalui metadata)
Setelah mengatur ini sekali, semua akses ke file akan dipaksa untuk diunduh. Ini diimplementasikan dengan memodifikasi bidang Content-Disposition dalam metadata file.
Menggunakan Konsol OSS
Di Konsol Manajemen OSS, temukan file target, klik Set File Metadata di panel detail file, atur Content-Disposition ke attachment, lalu klik OK untuk menyimpan.
Selain operasi konsol, Anda juga dapat merujuk ke Kelola metadata file untuk mengatur bidang ini menggunakan SDK atau antarmuka baris perintah ossutil.
Jika Anda juga ingin menyesuaikan nama file yang ditampilkan selama pengunduhan, lihat Sesuaikan nama file selama pengunduhan.
Dapatkan tautan ke versi file tertentu
Hasilkan tautan (URL yang ditandatangani sebelumnya) untuk versi file tertentu, berlaku untuk bucket dengan pengendalian versi diaktifkan.
Menggunakan Konsol OSS
-
Anda dapat masuk ke Konsol Manajemen OSS, membuka tab Files pada bucket target, lalu mengubah Historical Version menjadi Show di sudut kanan atas halaman.

-
Temukan file target, klik nama file versi historis yang diperlukan, dan Copy URL file versi ini di halaman detail.

Menggunakan Alibaba Cloud SDK
Java
Tambahkan kode kunci berikut:
// 1. Definisikan variabel ID versi
String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
// 2. Buat Map parameter kueri
Map<String, String> queryParam = new HashMap<String, String>();
queryParam.put("versionId", versionId);
// 3. Tambahkan parameter ID versi ke permintaan
request.setQueryParameter(queryParam);
Python
Tambahkan parameter version_id ke GetObjectRequest.
pre_result = client.presign(
oss.GetObjectRequest(
bucket=bucket_name,
key=object_name,
version_id='CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****' # Atur parameter VersionId
)
)
Go
Tambahkan bidang VersionId ke GetObjectRequest.
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
VersionId: oss.Ptr("CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE7****"), // Setel VersionId
}, oss.PresignExpires(10*time.Minute))
Node.js
Tambahkan parameter queries ke signatureUrlV4.
const signedUrl = await client.signatureUrlV4('GET', 3600, {
queries: {
"versionId": 'CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE7****' // Tambahkan parameter versionId
}
}, objectName);
PHP
Di GetObjectRequest, tambahkan parameter versionId.
// Tambahkan parameter versi spesifik
$versionId = "yourVersionId"; // Ganti dengan nomor versi aktual
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, versionId:$versionId);
Gunakan ossutil
Hasilkan URL yang ditandatangani untuk objek example.txt dengan ID versi 123 di bucket examplebucket.
ossutil presign oss://examplebucket/example.txt --version-id 123
Hasilkan tautan file secara batch
Disarankan menggunakan antarmuka baris perintah ossutil untuk menghasilkan tautan secara batch bagi file dalam seluruh folder.
Gunakan antarmuka baris perintah ossutil
-
Hasilkan URL yang ditandatangani sebelumnya dengan periode validitas default 15 menit untuk semua file di direktori folder bucket examplebucket.
ossutil presign oss://examplebucket/folder/ -r -
Hasilkan URL yang ditandatangani sebelumnya dengan periode validitas default 15 menit untuk file berekstensi .txt di direktori folder bucket examplebucket.
ossutil presign oss://examplebucket/folder/ -r --include "*.txt" -
Hasilkan URL yang ditandatangani sebelumnya dengan periode validitas default 15 menit untuk semua file di bucket examplebucket.
ossutil presign oss://examplebucket/ -r
Untuk informasi lebih lanjut tentang menghasilkan URL yang ditandatangani sebelumnya menggunakan ossutil, lihat presign (Hasilkan URL yang ditandatangani sebelumnya).
Gunakan Konsol OSS
Anda hanya dapat mengekspor URL yang ditandatangani sebelumnya untuk file di direktori saat ini, tidak termasuk file di subdirektori.
-
Pilih file objek, lalu klik Export URL List di bawah.

-
Di panel konfigurasi yang muncul, parameter default sesuai untuk sebagian besar skenario dan dapat digunakan tanpa modifikasi.
-
Klik OK untuk mengunduh dan menyimpan file daftar URL yang dihasilkan.
Gunakan Alibaba Cloud SDK
Gunakan operasi GetBucket (ListObjects) untuk mendapatkan semua nama objek, lalu hasilkan URL yang ditandatangani sebelumnya untuk setiap objek.
Sesuaikan nama file unduhan
Berdasarkan unduhan paksa, Anda dapat menentukan nama file yang dilihat pengguna saat menyimpan file. Metode 1 memiliki prioritas lebih tinggi daripada Metode 2.
Metode 1: Tetapkan Nama File Unduhan untuk Satu Permintaan
Tentukan nama file unduhan untuk satu URL yang ditandatangani sebelumnya dengan menambahkan parameter response-content-disposition yang diatur ke attachment, serta menyertakan parameter filename.
Java
Tetapkan parameter response-content-disposition.
// Setel nama file yang ditampilkan saat klien mengunduh, menggunakan "test.txt" sebagai contoh
String filename = "test.txt";
request.getResponseHeaders().setContentDisposition("attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));
Python
Gunakan parameter response_content_disposition untuk menyesuaikan nama file unduhan menjadi test.txt.
// Hasilkan permintaan GET yang ditandatangani sebelumnya
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, // Tentukan nama bucket
key=args.key, // Tentukan kunci objek
response_content_disposition="attachment;filename=test.txt",// Setel nama file yang ditampilkan saat klien mengunduh, dalam hal ini "test.txt"
)
)
Go
Gunakan parameter ResponseContentDisposition untuk menyesuaikan nama file unduhan menjadi test.txt.
// Hasilkan permintaan GET yang ditandatangani sebelumnya dengan perilaku unduh paksa
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment;filename=test.txt"),//Setel nama file yang ditampilkan saat klien mengunduh, dalam hal ini "test.txt"
})
Metode 2: Pengaturan Universal (Melalui Metadata)
Modifikasi metadata untuk menetapkan nama unduhan default terpadu bagi semua akses. Caranya adalah dengan mengubah bidang Content-Disposition dalam metadata file menjadi attachment; filename="yourFileName", di mana yourFileName adalah nama file kustom Anda, misalnya example.jpg.
Setel periode validitas tautan
Periode validitas tautan (URL yang ditandatangani sebelumnya) ditentukan saat pembuatan dan tidak dapat diubah setelahnya. Tautan tersebut dapat diakses berulang kali selama periode validitasnya, lalu menjadi tidak valid setelah kedaluwarsa.
Metode pembuatan yang berbeda mendukung periode validitas maksimum yang berbeda. Melebihi batas tersebut akan menyebabkan kegagalan pembuatan atau pengecualian akses.
Menggunakan Konsol OSS
Anda dapat masuk ke Konsol Manajemen OSS, membuka daftar Files bucket target, mengklik file yang diinginkan, lalu menetapkan periode validitas tautan pada kolom Expiration Time di panel detail sebelah kanan.
Menggunakan Alibaba Cloud SDK
Anda harus memiliki izin oss:GetObject agar pihak ketiga dapat berhasil mengunduh file melalui URL yang ditandatangani sebelumnya. Untuk informasi lebih lanjut mengenai otorisasi, lihat Berikan izin kustom kepada Pengguna RAM. Setelah URL dihasilkan, Anda dapat mengirimkannya kepada pihak ketiga yang memerlukan akses ke file tersebut.
Anda dapat menyetel waktu kedaluwarsa URL yang ditandatangani sebelumnya dengan mengubah nilai expiration dalam kode.
Java
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di Java.
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 endpoint publik wilayah China (Hangzhou). Tentukan endpoint aktual.
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 path lengkap objek. Misalnya, exampleobject.txt. Path 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 instance OSSClient.
// Saat instance 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 {
// Setel waktu kedaluwarsa URL yang ditandatangani sebelumnya dalam milidetik. Contoh ini menyetel waktu kedaluwarsa menjadi 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 respons kesalahan karena suatu alasan.");
System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
System.out.println("Kode Kesalahan:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("ID Host:" + 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 Kesalahan:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}Python
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di Python.
import argparse
import alibabacloud_oss_v2 as oss
# Buat parser parameter baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="presign get object sample")
# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib diisi.
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib diisi.
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# Tentukan parameter --endpoint untuk menunjukkan titik akhir wilayah tempat bucket berada. Parameter ini opsional.
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# Tentukan parameter --key untuk menunjukkan nama objek. Parameter ini wajib diisi.
parser.add_argument('--key', help='The name of the object.', required=True)
def main():
# Urai parameter baris perintah untuk mendapatkan nilai yang ditentukan.
args = parser.parse_args()
# Dari variabel lingkungan, muat informasi otentikasi yang diperlukan untuk mengakses OSS.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Gunakan konfigurasi default untuk membuat objek cfg dan tentukan penyedia kredensial.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# Atur atribut region dari objek cfg ke wilayah yang disediakan di baris perintah.
cfg.region = args.region
# Jika titik akhir kustom disediakan, perbarui atribut endpoint dari objek cfg dengan titik akhir yang disediakan.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Gunakan pengaturan sebelumnya untuk menginisialisasi instans OSSClient.
client = oss.Client(cfg)
# Mulai permintaan untuk membuat URL yang ditandatangani.
pre_result = client.presign(
oss.GetObjectRequest(
bucket=args.bucket, # Tentukan nama bucket.
key=args.key, # Tentukan kunci objek.
)
)
# Tampilkan metode HTTP, waktu kedaluwarsa, dan URL yang ditandatangani.
print(f'method: {pre_result.method},'
f' expiration: {pre_result.expiration.strftime("%Y-%m-%dT%H:%M:%S.000Z")},'
f' url: {pre_result.url}'
)
# Tampilkan header yang ditandatangani.
for key, value in pre_result.signed_headers.items():
print(f'signed headers key: {key}, signed headers value: {value}')
# Panggil fungsi utama untuk memulai logika pemrosesan saat skrip dijalankan secara langsung.
if __name__ == "__main__":
main() # Tentukan titik masuk skrip. Alur kontrol dimulai di sini.Go
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di Go.
package main
import (
"context"
"flag"
"log"
"time"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// Definisikan variabel global.
var (
region string // Wilayah tempat bucket berada.
bucketName string // Nama bucket.
objectName string // Nama objek.
)
// Fungsi init digunakan untuk menginisialisasi parameter baris perintah.
func init() {
flag.StringVar(®ion, "region", "", "Wilayah tempat bucket berada.")
flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
flag.StringVar(&objectName, "object", "", "Nama objek.")
}
func main() {
// Parsing parameter baris perintah.
flag.Parse()
// Periksa apakah nama bucket kosong.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama bucket diperlukan")
}
// Periksa apakah wilayah kosong.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, wilayah diperlukan")
}
// Periksa apakah nama objek kosong.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("parameter tidak valid, nama objek diperlukan")
}
// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Buat klien OSS.
client := oss.NewClient(cfg)
// Hasilkan URL yang ditandatangani sebelumnya untuk permintaan GetObject.
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
},
oss.PresignExpires(10*time.Minute),
)
if err != nil {
log.Fatalf("gagal mendapatkan presign objek %v", err)
}
log.Printf("metode permintaan:%v\n", result.Method)
log.Printf("waktu kedaluwarsa permintaan:%v\n", result.Expiration)
log.Printf("url permintaan:%v\n", result.URL)
if len(result.SignedHeaders) > 0 {
// Jika hasil yang dikembalikan berisi header yang ditandatangani, Anda harus menyertakan header permintaan yang sesuai saat mengirim permintaan GET menggunakan URL yang ditandatangani sebelumnya. Jika tidak, permintaan mungkin gagal atau terjadi kesalahan signature.
log.Printf("header yang ditandatangani:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Node.js
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di Node.js.
const OSS = require("ali-oss");
// Definisikan fungsi untuk menghasilkan URL yang ditandatangani sebelumnya.
async function generateSignatureUrl(fileName) {
// Dapatkan URL yang ditandatangani sebelumnya.
const client = await new OSS({
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// Ganti yourregion dengan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel Region ke oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
// Setel secure ke true untuk menggunakan HTTPS. Ini mencegah browser memblokir tautan unduh yang dihasilkan.
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // Setel header permintaan berdasarkan header permintaan aktual.
}, fileName);
}
// Panggil fungsi dan berikan nama file.
generateSignatureUrl('yourFileName').then(url => {
console.log('Generated Signature URL:', url);
}).catch(err => {
console.error('Error generating signature URL:', err);
});PHP
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di PHP.
<?php
// Impor file autoloader untuk memastikan library dependensi dimuat dengan benar.
require_once __DIR__ . '/../../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// Definisikan deskripsi untuk argumen baris perintah.
$optsdesc = [
"region" => ['help' => 'Wilayah tempat bucket berada.', 'required' => True], // Wilayah tempat bucket berada. (Wajib)
"endpoint" => ['help' => 'Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // Endpoint untuk mengakses OSS. (Opsional)
"bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. (Wajib)
"key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. (Wajib)
"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 dibutuhkan oleh getopt.
// Titik dua ":" setelah setiap argumen menunjukkan bahwa argumen tersebut memerlukan nilai.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Parsing argumen baris perintah.
$options = getopt("", $longopts);
// Periksa apakah semua argumen wajib disediakan.
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 wajib: --$key, $help" . PHP_EOL;
exit(1); // Jika argumen wajib hilang, keluar dari program.
}
}
// Ekstrak nilai dari argumen yang diparsing.
$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 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 endpoint disediakan, setel itu.
}
try {
// Buat instance 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 setel 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);
}.NET
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di .NET.
using Aliyun.OSS;
using Aliyun.OSS.Common;
// Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial dari variabel lingkungan. Sebelum menjalankan kode contoh, 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 path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Contoh: exampledir/exampleobject.txt.
var objectName = "exampledir/exampleobject.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instance ClientConfiguration dan modifikasi parameter default sesuai kebutuhan Anda.
var conf = new ClientConfiguration();
// Tentukan signature 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 sebelumnya.
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// Setel periode validitas URL yang ditandatangani sebelumnya. Nilai default: 3600. Satuan: detik.
Expiration = DateTime.UtcNow.AddHours(1),
};
var uri = client.GeneratePresignedUri(req);
// Cetak URL yang ditandatangani sebelumnya 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);
}Android
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di Android.
// Tentukan nama bucket, misalnya examplebucket.
String bucketName = "examplebucket";
// Tentukan path lengkap objek sumber, tanpa nama bucket, misalnya exampleobject.txt.
String objectKey = "exampleobject.txt";
String url = null;
try {
// Hasilkan URL yang ditandatangani sebelumnya untuk mengunduh file.
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// Setel waktu kedaluwarsa URL yang ditandatangani sebelumnya menjadi 30 menit.
request.setExpiration(30*60);
request.setMethod(HttpMethod.GET);
url = oss.presignConstrainedObjectURL(request);
Log.d("url", url);
} catch (ClientException e) {
e.printStackTrace();
}iOS
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di iOS.
// Tentukan nama bucket.
NSString *bucketName = @"examplebucket";
// Tentukan nama objek.
NSString *objectKey = @"exampleobject.txt";
__block NSString *urlString;
// Hasilkan URL yang ditandatangani sebelumnya dengan periode validitas untuk mengunduh objek. Dalam contoh ini, periode validitas URL adalah 30 menit.
OSSTask *task = [client presignConstrainURLWithBucketName:bucketName
withObjectKey:objectKey
httpMethod:@"GET"
withExpirationInterval:30 * 60
withParameters:@{}];
[task continueWithBlock:^id _Nullable(OSSTask * _Nonnull task) {
if (task.error) {
NSLog(@"presign error: %@", task.error);
} else {
urlString = task.result;
NSLog(@"url: %@", urlString);
}
return nil;
}];C++
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di C++.
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi tentang akun yang digunakan untuk mengakses OSS. */
/* Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. * /
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan path lengkap objek. Jangan sertakan nama bucket dalam path lengkap. Contoh: exampledir/exampleobject.txt. */
std::string GetobjectUrlName = "exampledir/exampleobject.txt";
/* Inisialisasi sumber daya, seperti sumber daya jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Tentukan periode validitas URL yang telah ditandatangani sebelumnya. Periode validitas maksimum adalah 32.400. Satuan: detik. */
std::time_t t = std::time(nullptr) + 1200;
/* Hasilkan URL yang telah ditandatangani sebelumnya. */
auto genOutcome = client.GeneratePresignedUrl(BucketName, GetobjectUrlName, t, Http::Get);
if (genOutcome.isSuccess()) {
std::cout << "GeneratePresignedUrl success, Gen url:" << genOutcome.result().c_str() << std::endl;
}
else {
/* Tangani pengecualian. */
std::cout << "GeneratePresignedUrl fail" <<
",code:" << genOutcome.error().Code() <<
",message:" << genOutcome.error().Message() <<
",requestId:" << genOutcome.error().RequestId() << std::endl;
return -1;
}
/* Lepaskan sumber daya, seperti sumber daya jaringan. */
ShutdownSdk();
return 0;
}Ruby
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di Ruby.
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Titik akhir Tiongkok (Hangzhou) digunakan sebagai contoh. Tentukan titik akhir sesuai wilayah Anda.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah diatur.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Tentukan nama bucket. Misalnya, examplebucket.
bucket = client.get_bucket('examplebucket')
# Buat URL yang telah ditandatangani dan atur periode validitasnya menjadi 1 jam (3600 detik).
puts bucket.object_url('my-object', true, 3600)C
Untuk informasi lebih lanjut mengenai SDK, lihat Unduh objek menggunakan URL yang ditandatangani sebelumnya di C.
#include "oss_api.h"
#include "aos_http_io.h"
/* Setel yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Misalnya, examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket. Misalnya, exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan path lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Inisialisasi tipe aos_string_t dengan string char*. */
aos_str_set(&options->config->endpoint, endpoint);
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah disetel. */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
/* Tentukan apakah akan menggunakan CNAME untuk mengakses OSS. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Setel parameter jaringan, seperti periode timeout. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Panggil metode aos_http_io_initialize di entri program untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* Pool memori (pool) untuk manajemen memori, yang setara dengan apr_pool_t. Kode implementasinya ada di library APR. */
aos_pool_t *pool;
/* Buat pool memori baru. Parameter kedua adalah NULL, yang menunjukkan bahwa pool tidak mewarisi dari pool memori lain. */
aos_pool_create(&pool, NULL);
/* Buat dan inisialisasi opsi. Parameter ini mencakup informasi konfigurasi global, seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
oss_request_options_t *oss_client_options;
/* Alokasikan memori untuk opsi dalam pool memori. */
oss_client_options = oss_request_options_create(pool);
/* Inisialisasi opsi klien oss_client_options. */
init_options(oss_client_options);
/* Inisialisasi parameter. */
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_http_request_t *req;
apr_time_t now;
char *url_str;
aos_string_t url;
int64_t expire_time;
int one_hour = 3600;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
expire_time = now / 1000000 + one_hour;
req = aos_http_request_create(pool);
req->method = HTTP_GET;
now = apr_time_now();
/* Satuan: mikrodetik. */
expire_time = now / 1000000 + one_hour;
/* Hasilkan URL yang ditandatangani sebelumnya. */
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
aos_str_set(&url, url_str);
printf("Temporary download URL: %s\n", url_str);
/* Lepaskan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk berbagai sumber daya selama permintaan. */
aos_pool_destroy(pool);
/* Lepaskan sumber daya global yang sebelumnya dialokasikan. */
aos_http_io_deinitialize();
return 0;
}Menggunakan alat baris perintah ossutil
Hasilkan URL yang ditandatangani sebelumnya dengan periode validitas 1 jam untuk objek example.txt di bucket examplebucket.
ossutil presign oss://examplebucket/example.txt --expires-duration 1h
Untuk contoh tambahan mengenai pembuatan URL yang ditandatangani sebelumnya menggunakan ossutil, lihat presign (Hasilkan URL yang ditandatangani sebelumnya).
Menggunakan alat manajemen grafis ossbrowser
ossbrowser mendukung operasi tingkat objek yang serupa dengan yang tersedia di konsol. Ikuti panduan antarmuka ossbrowser untuk menyelesaikan proses pembuatan URL yang ditandatangani sebelumnya. Untuk informasi lebih lanjut mengenai penggunaan ossbrowser, lihat 常用操作.
Dapatkan tautan valid jangka panjang
Anda dapat memperoleh URL file (tautan) tanpa signature dan batasan waktu kedaluwarsa melalui dua metode berikut.
-
Metode 1: Setel file ke public-read (tidak direkomendasikan)
Atur ACL file ke "public-read" untuk mendapatkan URL file yang valid secara permanen. Konfigurasi ini sederhana dan tidak memerlukan alat tambahan. Namun, alamat file sepenuhnya publik, dapat diakses oleh siapa saja, serta rentan terhadap crawler berbahaya atau penyalahgunaan lalu lintas. Kami merekomendasikan menggunakan metode ini bersama perlindungan hotlink OSS (daftar putih Referer), meskipun tetap terdapat risiko eksposur sumber daya.
-
Metode 2: Berikan akses public-read melalui CDN (direkomendasikan)
Pertahankan file dalam status privat dan aktifkan akses publik melalui CDN. Setelah mengaktifkan fitur back-to-origin bucket OSS privat untuk CDN, Anda dapat mengakses seluruh sumber daya di bucket privat melalui nama domain akselerasi CDN. Dengan demikian, mekanisme autentikasi privat dari URL asli menjadi tidak berlaku. Dibandingkan Metode 1, pendekatan ini tidak mengekspos OSS secara langsung, sehingga menawarkan keamanan lebih tinggi serta mendukung fitur akselerasi dan kontrol akses. Kami merekomendasikan mengaktifkan perlindungan hotlink Referer dan penandatanganan URL CDN guna mencegah penyalahgunaan tautan.
Cara Membuat URL File Valid Jangka Panjang
Anda dapat membuat alamat akses file berdasarkan jenis nama domain.
|
Jenis nama domain |
Format URL |
Contoh |
|
Nama domain default OSS |
|
Misalnya, di bucket bernama examplebucket di wilayah China (Hangzhou), terdapat folder bernama example yang berisi file bernama example.jpg.
|
|
Nama domain kustom |
|
Misalnya, jika Anda telah melampirkan nama domain kustom |
|
Nama domain akselerasi CDN |
|
Misalnya, saat nama domain akselerasi CDN adalah |
-
<BucketName>: Nama bucket. -
<ObjectName>: Path lengkap file (sepertifolder/example.jpg). -
<Endpoint>: titik akhir wilayah. -
<YourDomainName>: Nama domain kustom Anda. Untuk informasi lebih lanjut, lihat Lampirkan nama domain kustom ke nama domain default bucket. -
<nama domain akselerasi CDN>: Nama domain akselerasi CDN Anda.
Konfigurasi protokol HTTPS
Protokol tautan ditentukan oleh titik akhir. Titik akhir default tidak memerlukan konfigurasi dan langsung mendukung HTTPS. Jika menggunakan nama domain kustom, Anda harus terlebih dahulu menyelesaikan hosting sertifikat sebelum mengaktifkan protokol HTTPS.
-
Konsol OSS: Saat menghasilkan tautan, Anda dapat memilih protokol di panel detail. HTTPS merupakan protokol default.
-
ossutil/SDK: Protokol ini bergantung pada titik akhir yang Anda atur. Jika titik akhir diawali dengan
https://, HTTPS akan digunakan.
Teks Cina tidak terbaca saat mempratinjau file .txt
Saat mempratinjau file .txt di browser atau Konsol OSS, teks beraksara Cina mungkin muncul tidak terbaca karena file tidak mendeklarasikan format encoding yang benar. Untuk mengatasi hal ini, Anda dapat menyetel bidang Content-Type dalam metadata file ke text/plain;charset=utf-8, sehingga browser menampilkan konten menggunakan encoding UTF-8 yang sesuai.
-
Login ke Konsol Manajemen OSS.
-
Klik Bucket List, lalu klik nama bucket target.
-
Di panel navigasi kiri, pilih .
-
Di sebelah kanan objek target, pilih .
-
Di area HTTP Standard Properties, atur Content-Type ke text/plain;charset=utf-8.
-
Klik OK untuk menyimpan pengaturan.
Batasi sumber akses
Dengan mengonfigurasi perlindungan hotlink Referer, Anda dapat mengizinkan hanya situs web tertentu untuk mengakses sumber daya OSS dan menolak permintaan dari sumber lain.
Sebagai contoh, Anda dapat mengizinkan akses hanya dari situs web resmi Anda https://example.com; permintaan dari sumber lain akan ditolak.
Otorisasi pihak ketiga untuk operasi lebih lanjut
Selain URL yang ditandatangani, Alibaba Cloud menyediakan metode otorisasi sementara yang lebih fleksibel, yaitu kredensial akses sementara STS. Jika Anda ingin pihak ketiga melakukan operasi pada OSS selain mengunduh—seperti mencantumkan dan menyalin—kami merekomendasikan Anda mempelajari serta menggunakan kredensial akses sementara STS. Untuk informasi selengkapnya, lihat Akses OSS dengan kredensial akses sementara STS.
Pemrosesan gambar
Anda dapat menghasilkan URL yang ditandatangani sebelumnya dengan parameter pemrosesan gambar untuk memproses gambar, seperti mengubah ukuran dan menambahkan watermark.