All Products
Search
Document Center

Object Storage Service:Menggunakan URL yang ditandatangani sebelumnya untuk mengunduh atau meninjau file

Last Updated:Aug 26, 2026

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:

  1. Verifikasi izin: Saat membuat URL yang ditandatangani sebelumnya, Anda harus memiliki izin oss:GetObject agar pihak ketiga berhasil mengunduh/meninjau file melalui URL tersebut.

  2. Enkripsi lokal: Berdasarkan AK/SK, lakukan enkripsi dan hitung path file, waktu kedaluwarsa, serta informasi lainnya untuk mendapatkan signature (x-oss-signature).

  3. Tambahkan signature: Tambahkan parameter signature (x-oss-date, x-oss-expires, x-oss-credential, dll.) sebagai query string ke URL file.

  4. Bentuk tautan: Susun URL lengkap yang ditandatangani sebelumnya.

    Format URL yang ditandatangani sebelumnya

    https://BucketName.Endpoint/Object?signature parameters

    Contoh 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(&region, "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

  1. Login ke Konsol OSS.

  2. Di panel navigasi kiri, klik Buckets. Di halaman Buckets, klik nama bucket.

  3. Di pohon navigasi kiri, pilih Object Management > Objects.

  4. Di halaman Objek, klik nama objek.

  5. 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.

    2.png

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.

  1. Gunakan nama domain kustom untuk login ke ossbrowser.

  1. 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(&region, "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-Type diatur dengan tepat?

    Jika Content-Type file 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 dengan Content-Type. Jika tidak sesuai, lihat Kelola metadata objek untuk metode mengubah Content-Type file.

  • Apakah Content-Disposition diatur ke inline?

    Jika Content-Disposition file diatur ke attachment, browser akan memaksa file untuk diunduh. Lihat Kelola metadata objek untuk metode mengubahnya ke inline guna 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
})

Kode contoh lengkap

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;

import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // Masukkan nama domain kustom Anda. Contohnya, http://static.example.com.
        String endpoint = "http://static.example.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. Contohnya, examplebucket.
        String bucketName = "examplebucket";
        // Masukkan path lengkap objek. Contohnya, exampleobject.txt. Path lengkap tidak boleh berisi nama bucket.
        String objectName = "exampleobject.txt";

        // Buat instans OSSClient.
        // Saat instans OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
        String region = "cn-hangzhou";
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // Catatan: Jika Anda menggunakan nama domain kustom, Anda harus mengatur CNAME ke true.
        clientBuilderConfiguration.setSupportCname(true);

        //Atur algoritma tanda tangan V4.
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        URL signedUrl = null;
        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);

            // Tentukan nama file yang akan ditampilkan di klien selama pengunduhan. Contoh ini menggunakan "homework.txt".
            String filename = "homework.txt";

            // Buat URL yang ditandatangani.
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);

            // Atur perilaku unduhan (paksa unduh alih-alih pratinjau) dan nama file.
            request.getResponseHeaders().setContentDisposition("attachment;filename=" + URLEncoder.encode(filename,"UTF-8"));

            // Atur waktu kedaluwarsa.
            request.setExpiration(expiration);

            // Buat URL yang ditandatangani untuk permintaan HTTP GET.
            signedUrl = ossClient.generatePresignedUrl(request);
            // Cetak URL yang ditandatangani.
            System.out.println("signed url for getObject: " + signedUrl);
        } catch (OSSException oe) {
            System.out.println("Menangkap OSSException, yang berarti permintaan Anda berhasil sampai ke OSS, "
                    + "tetapi ditolak dengan tanggapan kesalahan karena alasan tertentu.");
            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("Menangkap ClientException, yang berarti klien mengalami "
                    + "masalah internal yang serius saat mencoba berkomunikasi dengan OSS, "
                    + "seperti tidak dapat mengakses jaringan.");
            System.out.println("Pesan Kesalahan:" + ce.getMessage());
        }
    }

}

Python

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser argumen baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="sampel pra-penandatanganan untuk 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.
    args = parser.parse_args()

    # Dapatkan kredensial akses dari variabel lingkungan untuk otentikasi.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Gunakan konfigurasi default untuk membuat objek konfigurasi (cfg) dan tentukan penyedia kredensial.
    cfg = oss.config.load_default()
    cfg.credentials_provider = credentials_provider

    # Atur atribut region dari objek cfg ke wilayah di parser.
    cfg.region = args.region

    # Jika titik akhir kustom disediakan, perbarui atribut titik akhir dari objek cfg dengan titik akhir yang disediakan.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Gunakan konfigurasi 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.
            response_content_disposition="attachment;filename=test.txt",
        )
    )

    # 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"

	"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(&region, "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)

	// Hasilkan URL yang ditandatangani untuk permintaan GetObject.
	result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
		Bucket:                     oss.Ptr(bucketName),
		Key:                        oss.Ptr(objectName),
		ResponseContentDisposition: oss.Ptr("attachment;filename=test.txt"),
	},
	)
	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 menentukan header permintaan yang sesuai saat Anda mengirimkan permintaan GET menggunakan URL yang ditandatangani.
		log.Printf("signed headers:\n")
		for k, v := range result.SignedHeaders {
			log.Printf("%v: %v\n", k, v)
		}
	}
}

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

  1. Anda dapat masuk ke Konsol Manajemen OSS, membuka tab Files pada bucket target, lalu mengubah Historical Version menjadi Show di sudut kanan atas halaman.

    image

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

    image

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);

Kode contoh lengkap

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.*;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws Throwable {
        // Contoh ini menggunakan titik akhir publik wilayah China (Hangzhou). Tentukan titik akhir aktual.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.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.
        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 versionId objek.
        String versionId = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3****";
        // Masukkan wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Wilayah 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 {
            // Buat permintaan.
            GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
            // Atur HttpMethod ke GET.
            generatePresignedUrlRequest.setMethod(HttpMethod.GET);
            // 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);
            generatePresignedUrlRequest.setExpiration(expiration);
            // versionId objek.
            Map<String, String> queryParam = new HashMap<String, String>();
            queryParam.put("versionId", versionId);
            generatePresignedUrlRequest.setQueryParameter(queryParam);
            // Hasilkan URL yang ditandatangani.
            URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
            System.out.println(url);
        } 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();
            }
        }
    }
}

Python

import argparse
import alibabacloud_oss_v2 as oss

# Buat parser parameter baris perintah dan jelaskan tujuan skrip.
parser = argparse.ArgumentParser(description="sampel dapatkan objek yang ditandatangani")

# 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():
    # 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 dari objek konfigurasi berdasarkan parameter baris perintah yang ditentukan oleh pengguna.
    cfg.region = args.region

    # Jika titik akhir kustom disediakan, perbarui atribut titik akhir 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.
    # Parameter version_id bersifat opsional. Anda hanya perlu menentukan parameter ini jika bucket yang berisi objek tersebut memiliki versi.
    pre_result = client.presign(
        oss.GetObjectRequest(
            bucket=args.bucket,  # Tentukan nama bucket.
            key=args.key,        # Tentukan kunci objek.
            version_id='yourVersionId'  # Jika berlaku, tentukan ID versi 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(&region, "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 dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat URL yang ditandatangani untuk permintaan GetObject.
	result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{
		Bucket:    oss.Ptr(bucketName),
		Key:       oss.Ptr(objectName),
		VersionId: oss.Ptr("yourVersionId"), // Tentukan ID versi.
	},
		oss.PresignExpires(10*time.Minute),
	)
	if err != nil {
		log.Fatalf("failed to get object presign %v", err)
	}
	log.Printf("get object presign result: %#v\n", result)
	log.Printf("get object url: %#v\n", result.URL)
}

Node.js

const OSS = require("ali-oss");

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 Region 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
});


// Buat URL yang ditandatangani.
const signedUrl = await client.signatureUrlV4('GET', 3600, {
  queries:{
    // Tentukan ID versi objek.
    "versionId":'yourVersionId'
  }
}, 'demo.pdf');

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)
];

// 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));

// Urai argumen baris perintah.
$options = getopt("", $longopts);

// Periksa apakah semua argumen yang diperlukan disediakan.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help']; // Dapatkan informasi bantuan untuk argumen.
        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.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]); // Jika titik akhir disediakan, atur titik akhir tersebut.
}

// Buat instans klien OSS.
$client = new Oss\Client($cfg);

$versionId = "yourVersionId"; // Nomor versi. Ini adalah nilai contoh. Ganti dengan ID versi yang sebenarnya.

// Buat objek GetObjectRequest untuk mengunduh objek.
$request = new Oss\Models\GetObjectRequest(bucket:$bucket, key:$key, versionId: $versionId);

// 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(
    '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.
);

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.

  1. Pilih file objek, lalu klik Export URL List di bawah.list

  2. Di panel konfigurasi yang muncul, parameter default sesuai untuk sebagian besar skenario dan dapat digunakan tanpa modifikasi.

    Deskripsi parameter (opsional)

    Parameter

    Deskripsi

    Use HTTPS

    Secara default, protokol HTTPS digunakan untuk menghasilkan URL file. Jika Anda ingin menggunakan protokol HTTP untuk menghasilkan URL file, matikan sakelar Use HTTPS.

    Validity Period

    Saat file objek bersifat privat, Anda perlu menyetel periode validitas untuk URL file.

    Nilai valid: 60 hingga 32400

    Satuan: detik

    Custom Domain Name

    Jika Anda ingin memastikan pihak ketiga mempratinjau gambar atau file web saat mengaksesnya, gunakan nama domain kustom yang dilampirkan ke bucket untuk menghasilkan URL yang ditandatangani.

    Opsi ini dapat dikonfigurasi hanya setelah nama domain kustom dilampirkan ke bucket.

    Accelerate Endpoint

    Jika pihak ketiga perlu mengakses file melalui jarak jauh seperti lintas negara atau samudra, disarankan untuk menggunakan titik akhir percepatan untuk menghasilkan URL.

    Opsi ini dapat dikonfigurasi hanya setelah akselerasi transfer diaktifkan untuk bucket.

  3. 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.

Periode Validitas Maksimum URL yang Ditandatangani Sebelumnya (Bacaan Opsional)

Periode validitas maksimum URL yang ditandatangani sebelumnya bergantung pada versi signature (V4 atau V1) serta alat yang digunakan untuk membuatnya. Signature V4 direkomendasikan karena menawarkan keamanan lebih tinggi dengan periode validitas maksimum 7 hari. Meskipun signature V1 mendukung periode validitas yang lebih lama, signature ini memiliki tingkat keamanan lebih rendah dan tidak lagi didukung, sehingga tidak direkomendasikan.

  • Signature V4 (direkomendasikan): Menggunakan waktu relatif untuk merepresentasikan periode validitas, yaitu “waktu UTC saat signature dihasilkan + periode validitas” menentukan waktu kedaluwarsa URL yang ditandatangani sebelumnya, dengan periode validitas maksimum 604.800 detik (7 hari).

  • Signature V1: Menggunakan stempel waktu UNIX untuk merepresentasikan periode validitas, dengan batas maksimum sesuai nilai terbesar yang dapat direpresentasikan oleh stempel waktu tersebut. Untuk perbandingan lebih lanjut antara signature V1 dan V4, lihat Perbandingan antara signature V1 dan V4.

Catatan

Jika Anda menghasilkan URL yang ditandatangani sebelumnya melalui Token STS, periode validitasnya dibatasi oleh periode validitas Token STS itu sendiri, yaitu paling lama 43.200 detik (12 jam).

Berikut adalah periode validitas maksimum saat menggunakan berbagai alat untuk menghasilkan URL yang ditandatangani sebelumnya.

Alat

Periode validitas maksimum

Deskripsi

OSS SDK 2.0

V1: Jangka panjang (batas stempel waktu)

V4: 604800 detik (7 hari)

Menggunakan V4 secara default, V1 dapat ditentukan.

Saat menggunakan signature V4, melebihi periode validitas maksimum akan menghasilkan kesalahan.

OSS SDK 1.0

V1: Jangka panjang (batas stempel waktu)

V4: 604800 detik (7 hari)

Menggunakan V1 secara default, V4 dapat ditentukan.

Saat menggunakan signature V4, melebihi periode validitas maksimum tidak akan menghasilkan kesalahan.

ossutil 2.0

V1: Jangka panjang (batas stempel waktu)

V4: 604800 detik (7 hari)

Menggunakan V4 secara default, V1 dapat ditentukan.

Saat menggunakan signature V4, melebihi periode validitas maksimum akan menghasilkan kesalahan.

ossutil 1.0

V1: Jangka panjang (batas stempel waktu)

V4: 604800 detik (7 hari)

Menggunakan V1 secara default, V4 dapat ditentukan.

Saat menggunakan signature V4, melebihi periode validitas maksimum tidak akan menghasilkan kesalahan.

Konsol

32400 detik (9 jam)

-

ossbrowser 2.0

32400 detik (9 jam)

Hanya mendukung V4.

ossbrowser 1.0

32400 detik (9 jam)

Hanya mendukung V1.

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

Catatan

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(&region, "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

https://<BucketName>.<Endpoint>/<ObjectName>

Misalnya, di bucket bernama examplebucket di wilayah China (Hangzhou), terdapat folder bernama example yang berisi file bernama example.jpg.

  • URL akses jaringan publik: https://examplebucket.oss-cn-hangzhou.aliyuncs.com/example/example.jpg

  • URL akses jaringan internal (untuk instance ECS di wilayah yang sama): https://examplebucket.oss-cn-hangzhou-internal.aliyuncs.com/example/example.jpg

Nama domain kustom

https://<YourDomainName>/<ObjectName>

Misalnya, jika Anda telah melampirkan nama domain kustom example.com ke examplebucket di wilayah China (Hangzhou), dan bucket berisi file example.jpg, URL file tersebut adalah https://example.com/example.jpg.

Nama domain akselerasi CDN

https://<nama domain akselerasi CDN>/<ObjectName>

Misalnya, saat nama domain akselerasi CDN adalah aliyundoc.com, untuk mengakses file image_01.jpg di direktori root, URL file tersebut adalah http://aliyundoc.com/image_01.jpg.

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.

  1. Login ke Konsol Manajemen OSS.

  2. Klik Bucket List, lalu klik nama bucket target.

  3. Di panel navigasi kiri, pilih Files > File List.

  4. Di sebelah kanan objek target, pilih Set File Metadata.

  5. Di area HTTP Standard Properties, atur Content-Type ke text/plain;charset=utf-8.

  6. 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.