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 mengizinkan pihak lain mengunduh atau melihat pratinjau file tertentu secara daring dalam periode validitas tertentu.
Cara kerja
Pembuatan URL yang ditandatangani sebelumnya bergantung pada enkripsi kunci rahasia dan penggabungan parameter. Prosesnya adalah sebagai berikut:
Verifikasi izin: Saat menghasilkan URL yang ditandatangani sebelumnya, Anda harus memiliki izin
oss:GetObjectagar pihak ketiga berhasil mengunduh atau melihat pratinjau file melalui URL tersebut.Enkripsi lokal: Berdasarkan AK/SK, enkripsi dan hitung jalur file, waktu kedaluwarsa, serta informasi lainnya untuk mendapatkan tanda tangan (
x-oss-signature).Tambahkan tanda tangan: Tambahkan parameter tanda tangan (
x-oss-date,x-oss-expires,x-oss-credential, dll.) sebagai string kueri 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 yang lebih rinci, lihat Signature Version 4 (Direkomendasikan).
Dapatkan tautan unduh file
Gunakan titik akhir default OSS untuk menghasilkan tautan unduh file dengan tanggal kedaluwarsa (URL yang ditandatangani sebelumnya).
Menggunakan konsol OSS
Masuk ke Konsol Manajemen OSS, buka daftar Files bucket target, klik file target, lalu klik Copy File URL di panel detail di sebelah kanan untuk mendapatkan tautan unduh sementara dengan periode validitas default 32400 detik (9 jam).
Menggunakan Alibaba Cloud SDK
Berikut contoh kode untuk menghasilkan tautan unduh file (URL yang ditandatangani sebelumnya) dalam berbagai bahasa pemrograman.
Java
Untuk informasi lebih lanjut, lihat Mengunduh 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 {
// Dalam contoh ini, titik akhir wilayah Tiongkok (Hangzhou) digunakan. Tentukan titik akhir aktual Anda.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap objek. Contoh: exampleobject.txt. Jangan sertakan nama bucket dalam jalur lengkap objek.
String objectName = "exampleobject.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou.
String region = "cn-hangzhou";
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya saat OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Tentukan periode validitas URL yang ditandatangani sebelumnya. Satuan: milidetik. Dalam contoh ini, periode validitas adalah 1 jam.
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// Hasilkan URL yang ditandatangani sebelumnya yang memungkinkan permintaan HTTP GET. Dalam contoh ini, tidak ada header permintaan tambahan yang ditentukan. Pengguna lain dapat mengakses konten terkait langsung menggunakan 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, lihat Mengunduh 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="contoh presign get object")
# Tentukan parameter --region untuk menunjukkan wilayah tempat bucket berada. Parameter ini wajib.
parser.add_argument('--region', help='Wilayah tempat bucket berada.', required=True)
# Tentukan parameter --bucket untuk menunjukkan nama bucket tempat objek disimpan. Parameter ini wajib.
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.
parser.add_argument('--key', help='Nama objek.', required=True)
def main():
# Uraikan parameter baris perintah untuk mendapatkan nilai yang ditentukan.
args = parser.parse_args()
# Dari variabel lingkungan, muat informasi autentikasi 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 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 instance OSSClient.
client = oss.Client(cfg)
# Mulai permintaan untuk menghasilkan URL yang ditandatangani sebelumnya.
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 sebelumnya.
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, lihat Mengunduh 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"
)
// 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() {
// Uraikan 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 tanda tangan.
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, lihat Mengunduh file menggunakan URL yang ditandatangani sebelumnya di Node.js.
const OSS = require("ali-oss");
// Tentukan fungsi yang digunakan 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 contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket Anda berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
// Atur secure ke true dan gunakan HTTPS untuk mencegah tautan unduh yang dihasilkan diblokir oleh browser.
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // Tentukan header permintaan berdasarkan header permintaan aktual.
}, fileName);
}
// Panggil fungsi dan masukkan nama objek.
generateSignatureUrl('yourFileName').then(url => {
console.log('URL Tanda Tangan yang Dihasilkan:', url);
}).catch(err => {
console.error('Kesalahan menghasilkan URL tanda tangan:', err);
});PHP
Untuk informasi lebih lanjut, lihat Mengunduh file menggunakan URL yang ditandatangani sebelumnya di PHP.
<?php
// Impor file autoloader untuk memastikan pustaka 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], // Titik akhir 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 diperlukan oleh getopt.
// Titik dua ":" setelah setiap argumen menunjukkan bahwa argumen tersebut memerlukan nilai.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Uraikan 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 "Kesalahan: argumen berikut wajib: --$key, $help" . PHP_EOL;
exit(1); // Jika argumen wajib hilang, keluar dari program.
}
}
// Ekstrak nilai dari argumen yang diuraikan.
$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 ID Kunci Akses dan Rahasia Kunci Akses 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.
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // Jika titik akhir disediakan, atur.
}
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 atur waktu kedaluwarsa.
$result = $client->presign($request, [
'expires' => new \DateInterval("PT{$expire}S") // PT berarti Period Time, dan S berarti detik.
]);
// Keluarkan URL yang ditandatangani.
echo "URL yang Ditandatangani: " . $result->url . PHP_EOL;
} catch (Exception $e) {
echo "Kesalahan: " . $e->getMessage() . PHP_EOL;
exit(1);
}.NET
Untuk informasi lebih lanjut, lihat Mengunduh 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 Tiongkok (Hangzhou), atur titik akhir menjadi 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 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 Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instance ClientConfiguration dan modifikasi parameter default berdasarkan kebutuhan Anda.
var conf = new ClientConfiguration();
// Tentukan tanda tangan V4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instance OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// Hasilkan URL yang ditandatangani sebelumnya.
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// Atur 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("URL yang Ditandatangani yang Dihasilkan: " + uri);
}
catch (OssException ex)
{
Console.WriteLine("Gagal dengan kode kesalahan: {0}; Info kesalahan: {1}. \nIDPermintaan:{2}\tIDHost:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Gagal dengan info kesalahan: {0}", ex.Message);
}Android
Untuk informasi SDK lebih lanjut, lihat Mengunduh file menggunakan URL yang ditandatangani sebelumnya di Android.
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap objek sumber. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampleobject.txt.
String objectKey = "exampleobject.txt";
String url = null;
try {
// Hasilkan URL yang ditandatangani sebelumnya untuk mengunduh objek.
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// Atur periode validitas 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 Mengunduh file 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(@"kesalahan presign: %@", task.error);
} else {
urlString = task.result;
NSLog(@"url: %@", urlString);
}
return nil;
}];C++
Untuk informasi SDK lebih lanjut, lihat Mengunduh file 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 titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou. * /
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur 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 berhasil, Gen url:" << genOutcome.result().c_str() << std::endl;
}
else {
/* Tangani pengecualian. */
std::cout << "GeneratePresignedUrl gagal" <<
",kode:" << genOutcome.error().Code() <<
",pesan:" << 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 Mengunduh file menggunakan URL yang ditandatangani sebelumnya di Ruby.
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Dalam contoh ini, titik akhir wilayah Tiongkok (Hangzhou) digunakan. Tentukan titik akhir aktual Anda.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Tentukan nama bucket. Contoh: examplebucket.
bucket = client.get_bucket('examplebucket')
# Hasilkan URL yang ditandatangani sebelumnya yang digunakan untuk mengunduh objek dan atur periode validitasnya menjadi 3.600 detik.
puts bucket.object_url('my-object', true, 3600)C
Untuk informasi SDK lebih lanjut, lihat Mengunduh file menggunakan URL yang ditandatangani sebelumnya di C.
#include "oss_api.h"
#include "aos_http_io.h"
/* Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Contoh: examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan jalur lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Gunakan string char* untuk menginisialisasi aos_string_t. */
aos_str_set(&options->config->endpoint, endpoint);
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
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. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Konfigurasikan parameter jaringan, seperti periode waktu habis. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Panggil metode aos_http_io_initialize di main() untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* Buat kumpulan memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode yang digunakan untuk membuat kumpulan memori termasuk dalam pustaka APR. */
aos_pool_t *pool;
/* Buat kumpulan memori. Nilai parameter kedua adalah NULL. Nilai ini menentukan bahwa kumpulan tidak mewarisi kumpulan 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 sumber daya memori di kumpulan memori ke opsi. */
oss_client_options = oss_request_options_create(pool);
/* Inisialisasi 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();
/* Tentukan periode validitas. 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("URL unduh sementara: %s\n", url_str);
/* Lepaskan kumpulan memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
aos_pool_destroy(pool);
/* Lepaskan sumber daya global yang 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.txtUntuk contoh lebih lanjut tentang 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 konsol. Ikuti antarmuka ossbrowser untuk menyelesaikan operasi mendapatkan URL yang ditandatangani sebelumnya. Untuk informasi tentang cara menggunakan ossbrowser, lihat Operasi umum.
Dapatkan tautan pratinjau daring untuk file
Untuk menghasilkan tautan yang mendukung pratinjau daring (URL yang ditandatangani sebelumnya), Anda harus terlebih dahulu melampirkan nama domain kustom. Setelah melampirkan nama domain kustom, gunakan nama tersebut untuk menghasilkan URL yang ditandatangani sebelumnya.
Gunakan konsol OSS
Masuk ke konsol OSS.
Di panel navigasi sebelah kiri, klik Buckets. Di halaman Bucket, klik nama bucket.
Di pohon navigasi sebelah 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 di konsol OSS. Ikuti petunjuk di layar ossbrowser untuk mendapatkan URL yang ditandatangani sebelumnya. Untuk informasi tentang cara mengunduh ossbrowser, lihat ossbrowser 1.0.
Gunakan nama domain kustom untuk masuk ke ossbrowser.
Dapatkan URL objek.
Gunakan SDK OSS
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 {
// Tentukan nama domain kustom. Contoh: https://static.example.com.
String endpoint = "yourCustomEndpoint";
// Tentukan wilayah tempat bucket berada. Contoh: cn-hangzhou.
String region = "cn-hangzhou";
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt.
String objectName = "exampleobject.txt";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, Anda harus mengonfigurasi variabel lingkungan.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya saat OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// Untuk mengaktifkan CNAME, atur parameter ini ke true.
clientBuilderConfiguration.setSupportCname(true);
// Secara eksplisit nyatakan penggunaan algoritma tanda tangan V4.
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Tentukan periode validitas URL yang ditandatangani sebelumnya. Satuan: milidetik. Dalam contoh ini, periode validitas diatur menjadi 1 jam.
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// Hasilkan URL yang ditandatangani sebelumnya.
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
// Atur periode validitas URL.
request.setExpiration(expiration);
// Hasilkan URL yang ditandatangani sebelumnya yang memungkinkan permintaan HTTP GET.
URL signedUrl = ossClient.generatePresignedUrl(request);
// Tampilkan URL yang ditandatangani sebelumnya.
System.out.println("url yang ditandatangani untuk getObject: " + signedUrl);
} 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();
}
}
}
}PHP
<?php
// Impor file autoloader untuk memastikan pustaka 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], // Titik akhir untuk mengakses OSS. (Opsional)
"bucket" => ['help' => 'Nama bucket', 'required' => True], // Nama bucket. (Wajib)
"key" => ['help' => 'Nama objek', 'required' => True], // Nama objek. (Wajib)
];
// Konversi 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));
// Uraikan 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 "Kesalahan: argumen berikut wajib: --$key, $help" . PHP_EOL;
exit(1); // Jika argumen wajib hilang, keluar dari program.
}
}
// Ekstrak nilai dari argumen yang diuraikan.
$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 Kunci Akses dan Rahasia Kunci Akses 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 CNAME.
// 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.
$result = $client->presign($request);
// Cetak hasil presign.
// Keluarkan URL yang ditandatangani, yang dapat digunakan pengguna secara langsung untuk mengunduh objek.
print(
'hasil presign get object:' . var_export($result, true) . PHP_EOL . // Informasi rinci tentang hasil presign.
'url get object:' . $result->url . PHP_EOL // URL yang ditandatangani untuk mengunduh objek secara langsung.
);
Node.js
const OSS = require("ali-oss");
// Tentukan fungsi yang digunakan untuk menghasilkan URL yang ditandatangani sebelumnya.
async function generateSignatureUrl(fileName) {
// Dapatkan URL yang ditandatangani sebelumnya.
const client = await new OSS({
// Tentukan nama domain kustom yang ingin Anda petakan ke bucket.
endpoint: 'http://static.example.com',
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket Anda berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
authorizationV4: true,
cname: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // Tentukan header permintaan berdasarkan header permintaan aktual.
}, fileName);
}
// Panggil fungsi dan masukkan nama objek.
generateSignatureUrl('yourFileName').then(url => {
console.log('URL Tanda Tangan yang Dihasilkan:', url);
}).catch(err => {
console.error('Kesalahan menghasilkan URL tanda tangan:', 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 autentikasi 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
# 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"
)
// 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() {
// Uraikan 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).
WithEndpoint("http://static.example.com").
WithUseCName(true)
// 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),
//RequestPayer: oss.Ptr("requester"), // Tentukan identitas peminta.
},
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 Anda menentukan header permintaan saat menghasilkan URL yang ditandatangani sebelumnya yang memungkinkan permintaan HTTP GET, pastikan header permintaan disertakan dalam permintaan GET yang dimulai menggunakan URL yang ditandatangani sebelumnya. Ini mencegah kegagalan permintaan dan kesalahan tanda tangan.
log.Printf("header yang ditandatangani:\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 tanpa 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, sehingga file diunduh sebagai lampiran. Anda dapat memeriksa Cara mengatur Content-Type (MIME)? untuk memastikan 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 diunduh. Lihat Kelola metadata objek untuk metode mengubahnya menjadiinlineagar mendukung pratinjau.Apakah cache CDN telah disegarkan?
Jika Anda tidak menggunakan akselerasi CDN, Anda dapat mengabaikan item ini.
Jika Anda menggunakan CDN untuk mengakses sumber daya OSS, segarkan cache CDN setelah memodifikasi metadata file. Jika tidak, konfigurasi lama mungkin masih digunakan, sehingga pratinjau tidak berlaku.
Dapatkan tautan unduh paksa untuk file
Jika tautan saat ini (URL yang ditandatangani sebelumnya) langsung membuka pratinjau di browser tetapi Anda ingin mengunduhnya, gunakan metode berikut. Metode 1 memiliki prioritas lebih tinggi daripada Metode 2.
Metode 1: Unduh paksa satu kali
Metode ini hanya berlaku untuk tautan yang dihasilkan saat ini. Terapkan 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);
// Atur unduhan 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",# Atur ke unduhan paksa
)
)Go
Tambahkan parameter ResponseContentDisposition di GetObjectRequest dan atur nilainya ke attachment.
// Hasilkan permintaan GET yang ditandatangani sebelumnya dengan perilaku unduhan paksa
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment"), // Atur ke unduhan paksa
})Metode 2: Pengaturan unduhan paksa universal (melalui metadata)
Setelah pengaturan ini diterapkan sekali, semua akses ke file akan dipaksa 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 melalui 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
Masuk ke Konsol Manajemen OSS, buka tab Files bucket target, lalu alihkan Historical Version ke Show di pojok kanan atas halaman.

Temukan file target, klik nama file versi historis yang diperlukan, lalu Copy URL file versi tersebut 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****"), // Atur 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 tertentu
$versionId = "yourVersionId"; // Ganti dengan nomor versi aktual
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, versionId:$versionId);Menggunakan ossutil
Hasilkan URL yang ditandatangani sebelumnya untuk objek example.txt dengan ID versi 123 di bucket examplebucket.
ossutil presign oss://examplebucket/example.txt --version-id 123Hasilkan tautan file secara batch
Disarankan menggunakan antarmuka baris perintah ossutil, yang dapat menghasilkan tautan secara batch untuk 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/ -rHasilkan URL yang ditandatangani sebelumnya dengan periode validitas default 15 menit untuk file dengan ekstensi .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 subdirektori.
Pilih file objek, lalu klik Export URL List di bawah.

Di panel konfigurasi yang muncul, parameter default cocok 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 lebih lanjut menentukan nama file yang dilihat pengguna saat menyimpan file. Metode 1 memiliki prioritas lebih tinggi daripada Metode 2.
Metode 1: Atur nama file unduhan untuk satu permintaan
Tentukan nama file unduhan untuk satu URL yang ditandatangani dengan menambahkan parameter response-content-disposition yang diatur ke attachment dan menyertakan parameter filename.
Java
Atur parameter response-content-disposition.
// Atur 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",// Atur 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 unduhan paksa
result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
ResponseContentDisposition: oss.Ptr("attachment;filename=test.txt"),//Atur nama file yang ditampilkan saat klien mengunduh, dalam hal ini "test.txt"
})Metode 2: Pengaturan universal (melalui metadata)
Modifikasi metadata untuk mengatur nama unduhan default terpadu bagi semua akses. Ini diimplementasikan dengan memodifikasi bidang Content-Disposition dalam metadata file menjadi attachment; filename="yourFileName", di mana yourFileName adalah nama file kustom Anda, seperti example.jpg.
Atur periode validitas tautan
Periode validitas tautan (URL yang ditandatangani sebelumnya) diatur saat dihasilkan dan tidak dapat diubah setelahnya. Tautan dapat diakses beberapa kali selama periode validitasnya dan menjadi tidak valid setelah kedaluwarsa.
Metode pembuatan yang berbeda mendukung periode validitas maksimum yang berbeda. Melebihi batas akan menyebabkan kegagalan pembuatan atau pengecualian akses.
Menggunakan konsol OSS
Masuk ke Konsol Manajemen OSS, buka daftar Files bucket target, klik file target, lalu atur periode validitas tautan di Expiration Time di panel detail di sebelah kanan.
Menggunakan Alibaba Cloud SDK
Anda harus memiliki izin oss:GetObject agar pihak ketiga berhasil mengunduh file melalui URL yang ditandatangani sebelumnya. Untuk operasi otorisasi spesifik, lihat Berikan izin kustom kepada pengguna RAM. Setelah dihasilkan, Anda dapat mengirim tautan ke pihak ketiga yang perlu mengakses file.
Anda dapat mengatur waktu kedaluwarsa URL yang ditandatangani sebelumnya dengan memodifikasi kedaluwarsa dalam kode.
Java
Untuk informasi SDK lebih lanjut, lihat Mengunduh 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 {
// Dalam contoh ini, titik akhir wilayah Tiongkok (Hangzhou) digunakan. Tentukan titik akhir aktual Anda.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap objek. Contoh: exampleobject.txt. Jangan sertakan nama bucket dalam jalur lengkap objek.
String objectName = "exampleobject.txt";
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou.
String region = "cn-hangzhou";
// Buat instance OSSClient.
// Panggil metode shutdown untuk melepaskan sumber daya saat OSSClient tidak lagi digunakan.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Tentukan periode validitas URL yang ditandatangani sebelumnya. Satuan: milidetik. Dalam contoh ini, periode validitas adalah 1 jam.
Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
// Hasilkan URL yang ditandatangani sebelumnya yang memungkinkan permintaan HTTP GET. Dalam contoh ini, tidak ada header permintaan tambahan yang ditentukan. Pengguna lain dapat mengakses konten terkait langsung menggunakan 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 SDK lebih lanjut, lihat Mengunduh 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='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 autentikasi 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)
# Memulai permintaan untuk membuat URL yang telah ditandatangani sebelumnya.
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 telah ditandatangani sebelumnya.
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 SDK lebih lanjut, lihat Mengunduh 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() {
// Uraikan 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 tanda tangan.
log.Printf("header yang ditandatangani:\n")
for k, v := range result.SignedHeaders {
log.Printf("%v: %v\n", k, v)
}
}
}
Node.js
Untuk informasi SDK lebih lanjut, lihat Mengunduh objek menggunakan URL yang ditandatangani sebelumnya di Node.js.
const OSS = require("ali-oss");
// Tentukan fungsi yang digunakan 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 contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: 'examplebucket',
// Tentukan wilayah tempat bucket berada. Misalnya, jika bucket Anda berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi oss-cn-hangzhou.
region: 'oss-cn-hangzhou',
// Atur secure ke true dan gunakan HTTPS untuk mencegah tautan unduh yang dihasilkan diblokir oleh browser.
secure: true,
authorizationV4: true
});
return await client.signatureUrlV4('GET', 3600, {
headers: {} // Tentukan header permintaan berdasarkan header permintaan aktual.
}, fileName);
}
// Panggil fungsi dan masukkan nama objek.
generateSignatureUrl('yourFileName').then(url => {
console.log('URL Tanda Tangan yang Dihasilkan:', url);
}).catch(err => {
console.error('Kesalahan menghasilkan URL tanda tangan:', err);
});PHP
Untuk informasi SDK lebih lanjut, lihat Mengunduh objek menggunakan URL yang ditandatangani sebelumnya di PHP.
<?php
// Impor file autoloader untuk memastikan pustaka 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], // Titik akhir 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 diperlukan oleh getopt.
// Titik dua ":" setelah setiap argumen menunjukkan bahwa argumen tersebut memerlukan nilai.
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// Uraikan 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 "Kesalahan: argumen berikut wajib: --$key, $help" . PHP_EOL;
exit(1); // Jika argumen wajib hilang, keluar dari program.
}
}
// Ekstrak nilai dari argumen yang diuraikan.
$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 ID Kunci Akses dan Rahasia Kunci Akses 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.
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // Jika titik akhir disediakan, atur.
}
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 atur waktu kedaluwarsa.
$result = $client->presign($request, [
'expires' => new \DateInterval("PT{$expire}S") // PT berarti Period Time, dan S berarti detik.
]);
// Keluarkan URL yang ditandatangani.
echo "URL yang Ditandatangani: " . $result->url . PHP_EOL;
} catch (Exception $e) {
echo "Kesalahan: " . $e->getMessage() . PHP_EOL;
exit(1);
}.NET
Untuk informasi SDK lebih lanjut, lihat Mengunduh objek 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 Tiongkok (Hangzhou), atur titik akhir menjadi 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 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 Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instance ClientConfiguration dan modifikasi parameter default berdasarkan kebutuhan Anda.
var conf = new ClientConfiguration();
// Tentukan tanda tangan V4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instance OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var metadata = client.GetObjectMetadata(bucketName, objectName);
var etag = metadata.ETag;
// Hasilkan URL yang ditandatangani sebelumnya.
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
// Atur 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("URL yang Ditandatangani yang Dihasilkan: " + uri);
}
catch (OssException ex)
{
Console.WriteLine("Gagal dengan kode kesalahan: {0}; Info kesalahan: {1}. \nIDPermintaan:{2}\tIDHost:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Gagal dengan info kesalahan: {0}", ex.Message);
}Android
Untuk informasi SDK lebih lanjut, lihat Mengunduh objek menggunakan URL yang ditandatangani sebelumnya di Android.
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap objek sumber. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampleobject.txt.
String objectKey = "exampleobject.txt";
String url = null;
try {
// Hasilkan URL yang ditandatangani sebelumnya untuk mengunduh objek.
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
// Atur periode validitas 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 Mengunduh 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(@"kesalahan presign: %@", task.error);
} else {
urlString = task.result;
NSLog(@"url: %@", urlString);
}
return nil;
}];C++
Untuk informasi SDK lebih lanjut, lihat Mengunduh 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 titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Tentukan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur wilayah menjadi cn-hangzhou. * /
std::string Region = "yourRegion";
/* Tentukan nama bucket. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur 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 berhasil, Gen url:" << genOutcome.result().c_str() << std::endl;
}
else {
/* Tangani pengecualian. */
std::cout << "GeneratePresignedUrl gagal" <<
",kode:" << genOutcome.error().Code() <<
",pesan:" << 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 Mengunduh objek menggunakan URL yang ditandatangani sebelumnya di Ruby.
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# Dalam contoh ini, titik akhir wilayah Tiongkok (Hangzhou) digunakan. Tentukan titik akhir Anda yang sebenarnya.
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum Anda menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# Tentukan nama bucket. Contoh: examplebucket.
bucket = client.get_bucket('examplebucket')
# Buat URL yang telah ditandatangani yang digunakan untuk mengunduh objek dan atur periode validitasnya menjadi 3.600 detik.
puts bucket.object_url('my-object', true, 3600)C
Untuk informasi SDK lebih lanjut, lihat Mengunduh objek menggunakan URL yang ditandatangani sebelumnya di C.
#include "oss_api.h"
#include "aos_http_io.h"
/* Tentukan titik akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah Tiongkok (Hangzhou), atur titik akhir menjadi https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Contoh: examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan jalur lengkap objek. Jangan sertakan nama bucket dalam jalur lengkap. Contoh: exampledir/exampleobject.txt. */
const char *object_name = "exampledir/exampleobject.txt";
/* Tentukan jalur lengkap file lokal. */
const char *local_filename = "yourLocalFilename";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Gunakan string char* untuk menginisialisasi aos_string_t. */
aos_str_set(&options->config->endpoint, endpoint);
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
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. Nilai 0 menunjukkan bahwa CNAME tidak digunakan. */
options->config->is_cname = 0;
/* Konfigurasikan parameter jaringan, seperti periode waktu habis. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Panggil metode aos_http_io_initialize di main() untuk menginisialisasi sumber daya global, seperti jaringan dan memori. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* Buat kumpulan memori untuk mengelola memori. aos_pool_t setara dengan apr_pool_t. Kode yang digunakan untuk membuat kumpulan memori termasuk dalam pustaka APR. */
aos_pool_t *pool;
/* Buat kumpulan memori. Nilai parameter kedua adalah NULL. Nilai ini menentukan bahwa kumpulan tidak mewarisi kumpulan 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 sumber daya memori di kumpulan memori ke opsi. */
oss_client_options = oss_request_options_create(pool);
/* Inisialisasi 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();
/* Tentukan periode validitas. 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("URL unduh sementara: %s\n", url_str);
/* Lepaskan kumpulan memori. Operasi ini melepaskan sumber daya memori yang dialokasikan untuk permintaan. */
aos_pool_destroy(pool);
/* Lepaskan sumber daya global yang 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 1hUntuk contoh lebih lanjut tentang menghasilkan 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 konsol. Ikuti panduan antarmuka ossbrowser untuk menyelesaikan operasi mendapatkan URL yang ditandatangani sebelumnya. Untuk informasi lebih lanjut tentang cara menggunakan ossbrowser, lihat Operasi umum.
Dapatkan tautan valid jangka panjang
Anda dapat memperoleh URL file (tautan) tanpa tanda tangan dan batasan waktu kedaluwarsa melalui dua metode berikut.
Metode 1: Atur file ke baca-publik (tidak direkomendasikan)
Atur ACL file ke "baca-publik" untuk mendapatkan URL file yang berlaku permanen. Konfigurasi ini sederhana dan tidak memerlukan alat tambahan. Namun, alamat file sepenuhnya publik, dapat diakses oleh siapa saja, dan rentan terhadap perayap berbahaya atau penyalahgunaan lalu lintas. Kami merekomendasikan menggunakan metode ini dengan perlindungan hotlink OSS (daftar putih Referer), tetapi risiko mengekspos sumber tetap ada.
Metode 2: Berikan akses baca-publik melalui CDN (direkomendasikan)
Pertahankan file privat dan terapkan akses publik melalui CDN. Setelah mengaktifkan fitur kembali-ke-asal bucket OSS pribadi untuk CDN, Anda dapat mengakses semua sumber daya di bucket privat melalui nama domain akselerasi CDN. Metode autentikasi privat dari URL asli akan menjadi tidak valid. Dibandingkan dengan Metode 1, OSS tidak langsung diekspos, memberikan keamanan lebih tinggi dan mendukung fitur akselerasi serta kontrol akses. Kami merekomendasikan mengaktifkan perlindungan hotlink Referer dan penandatanganan URL CDN untuk mencegah penyalahgunaan tautan.
Cara menyusun URL file valid jangka panjang
Anda dapat menyusun alamat akses file berdasarkan jenis nama domain.
Jenis nama domain | Format URL | Contoh |
Nama domain default OSS |
| Misalnya, di bucket bernama examplebucket di wilayah Tiongkok (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, ketika nama domain akselerasi CDN adalah |
<BucketName>: Nama bucket.<ObjectName>: Jalur 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.
Konfigurasikan protokol HTTPS
Protokol tautan ditentukan oleh titik akhir. Titik akhir default tidak memerlukan konfigurasi dan langsung mendukung HTTPS. Saat menggunakan nama domain kustom, Anda harus terlebih dahulu menyelesaikan penyimpanan sertifikat sebelum dapat mengaktifkan protokol HTTPS.
Konsol OSS: Saat menghasilkan tautan, Anda dapat memilih protokol di panel detail. HTTPS adalah protokol default.
ossutil/SDK: Ini bergantung pada titik akhir yang Anda atur. Jika dimulai dengan
https://, HTTPS digunakan.
Teks Cina tidak terbaca saat mempratinjau file .txt
Saat mempratinjau file .txt di browser atau konsol OSS, jika karakter Cina muncul sebagai teks tidak terbaca, biasanya karena file tidak menyatakan format encoding yang benar. Anda dapat mengatur bidang Content-Type dalam metadata file ke text/plain;charset=utf-8, yang memaksa browser menampilkan konten menggunakan encoding UTF-8 yang benar.
Masuk ke Konsol Manajemen OSS.
Klik Bucket List, lalu klik nama bucket target.
Di panel navigasi sebelah 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
Melalui mengonfigurasi perlindungan hotlink Referer, Anda dapat mengizinkan hanya situs web tertentu untuk mengakses sumber daya OSS dan menolak permintaan dari sumber lain.
Misalnya, Anda dapat mengizinkan hanya permintaan akses dari situs web resmi Anda https://example.com, dan 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—kredensial akses sementara STS. Jika Anda ingin pihak ketiga melakukan operasi pada OSS selain mengunduh, seperti mencantumkan dan menyalin, kami merekomendasikan Anda mempelajari dan menggunakan kredensial akses sementara STS. Untuk informasi lebih lanjut, 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 gambar dan menambahkan watermark.