全部产品
Search
文档中心

Object Storage Service:Unduh objek menggunakan URL yang ditandatangani (PHP SDK V1)

更新时间:Nov 30, 2025

Secara default, objek dalam bucket Object Storage Service (OSS) bersifat privat dan hanya dapat diakses oleh pemiliknya. Anda dapat menggunakan OSS PHP Software Development Kit (SDK) untuk menghasilkan URL yang ditandatangani untuk permintaan GET. URL tersebut memiliki masa berlaku tertentu dan memungkinkan pengguna lain mengunduh objek secara sementara. URL ini dapat diakses beberapa kali sebelum kedaluwarsa. Setelah masa berlaku habis, Anda harus membuat URL baru.

Catatan

  • Topik ini menggunakan endpoint publik wilayah China (Hangzhou). Untuk mengakses OSS dari layanan Alibaba Cloud lainnya dalam wilayah yang sama, gunakan endpoint internal. Untuk informasi selengkapnya mengenai wilayah dan endpoint yang didukung, lihat Wilayah dan titik akhir.

  • Topik ini memberikan contoh cara memperoleh kredensial akses dari variabel lingkungan. Untuk informasi selengkapnya tentang konfigurasi kredensial akses, lihat Konfigurasikan kredensial akses (PHP SDK V1).

  • Untuk menghasilkan URL yang ditandatangani untuk permintaan GET, Anda harus memiliki izin oss:GetObject. Untuk informasi selengkapnya, lihat Berikan kebijakan akses kustom kepada RAM user.

  • Topik ini menggunakan contoh URL yang ditandatangani versi V4. Masa berlaku maksimum adalah 7 hari. Untuk informasi selengkapnya, lihat Signature Version 4 (disarankan).

  • Jika URL yang ditandatangani yang dihasilkan dari contoh berikut mengandung tanda plus (+), Anda mungkin tidak dapat mengakses URL tersebut. Untuk mengaksesnya, ganti tanda + dengan %2B.

  • Untuk menghasilkan URL yang ditandatangani menggunakan protokol HTTPS, atur protokol komunikasi pada Endpoint ke HTTPS.

Proses

Langkah-langkah berikut menjelaskan cara menggunakan URL yang ditandatangani untuk mengunduh objek:

Contoh kode

  1. Pemilik objek menghasilkan URL yang ditandatangani untuk permintaan GET.

    <?php
    if (is_file(__DIR__ . '/../autoload.php')) {
        require_once __DIR__ . '/../autoload.php';
    }
    if (is_file(__DIR__ . '/../vendor/autoload.php')) {
        require_once __DIR__ . '/../vendor/autoload.php';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    use OSS\Http\RequestCore;
    use OSS\Http\ResponseCore;
    use OSS\Credentials\EnvironmentVariableCredentialsProvider;
    
    // Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
    $provider = new EnvironmentVariableCredentialsProvider();
    // Atur yourEndpoint ke Titik Akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Titik Akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
    $endpoint = "yourEndpoint";
    // Tentukan nama bucket.
    $bucket= "examplebucket";
    // Tentukan jalur lengkap objek. Jangan sertakan nama bucket.
    $object = "exampleobject.txt";
    // Atur waktu kedaluwarsa URL yang ditandatangani menjadi 600 detik. Nilai maksimum adalah 32400 detik.
    $timeout = 600;
    try {
        $config = array(  
            "provider" => $provider,
            "endpoint" => $endpoint,
            'signatureVersion'=>OssClient::OSS_SIGNATURE_VERSION_V4,
            "region"=> "cn-hangzhou"
        );
        $ossClient = new OssClient($config);
        // Hasilkan URL yang ditandatangani.
        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET");
        print_r($signedUrl);
    } catch (OssException $e) {
        printf(__FUNCTION__ . ": GAGAL\n");
        printf($e->getMessage() . "\n");
        return;
    }           
  2. Pengguna lain menggunakan URL yang ditandatangani tersebut untuk permintaan GET guna mengunduh objek.

    curl

    curl -SO "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"

    Java

    import java.io.BufferedInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class Demo {
        public static void main(String[] args) {
            // Ganti URL dengan URL yang ditandatangani yang dihasilkan untuk permintaan GET.
            String fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********";
            // Tentukan jalur tujuan untuk menyimpan file, termasuk nama file dan ekstensinya.
            String savePath = "C:/downloads/myfile.txt";
    
            try {
                downloadFile(fileURL, savePath);
                System.out.println("Pengunduhan selesai!");
            } catch (IOException e) {
                System.err.println("Terjadi error saat mengunduh: " + e.getMessage());
            }
        }
    
        private static void downloadFile(String fileURL, String savePath) throws IOException {
            URL url = new URL(fileURL);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            httpConn.setRequestMethod("GET");
    
            // Periksa kode respons.
            int responseCode = httpConn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // Aliran input.
                InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
                // Aliran output.
                FileOutputStream outputStream = new FileOutputStream(savePath);
    
                byte[] buffer = new byte[4096]; // Buffer.
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
    
                outputStream.close();
                inputStream.close();
            } else {
                System.out.println("Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: " + responseCode);
            }
            httpConn.disconnect();
        }
    }

    Node.js

    const https = require('https');
    const fs = require('fs');
    
    const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********";
    const savePath = "C:/downloads/myfile.txt";
    
    https.get(fileURL, (response) => {
        if (response.statusCode === 200) {
            const fileStream = fs.createWriteStream(savePath);
            response.pipe(fileStream);
            
            fileStream.on('finish', () => {
                fileStream.close();
                console.log("Pengunduhan selesai!");
            });
        } else {
            console.error(`Pengunduhan gagal. Server merespons dengan kode: ${response.statusCode}`);
        }
    }).on('error', (err) => {
        console.error("Terjadi error saat mengunduh:", err.message);
    });

    Python

    import requests
    
    file_url = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"
    save_path = "C:/downloads/myfile.txt"
    
    try:
        response = requests.get(file_url, stream=True)
        if response.status_code == 200:
            with open(save_path, 'wb') as f:
                for chunk in response.iter_content(4096):
                    f.write(chunk)
            print("Pengunduhan selesai!")
        else:
            print(f"Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: {response.status_code}")
    except Exception as e:
        print("Terjadi error saat mengunduh:", e)

    Go

    package main
    
    import (
        "io"
        "net/http"
        "os"
    )
    
    func main() {
        fileURL := "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********"
        savePath := "C:/downloads/myfile.txt"
    
        response, err := http.Get(fileURL)
        if err != nil {
            panic(err)
        }
        defer response.Body.Close()
    
        if response.StatusCode == http.StatusOK {
            outFile, err := os.Create(savePath)
            if err != nil {
                panic(err)
            }
            defer outFile.Close()
    
            _, err = io.Copy(outFile, response.Body)
            if err != nil {
                panic(err)
            }
            println("Pengunduhan selesai!")
        } else {
            println("Tidak ada file untuk diunduh. Server merespons dengan kode HTTP:", response.StatusCode)
        }
    }

    JavaScript

    const fileURL = "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********";
    const savePath = "C:/downloads/myfile.txt"; // Nama file yang akan digunakan saat file diunduh.
    
    fetch(fileURL)
        .then(response => {
            if (!response.ok) {
                throw new Error(`Server merespons dengan kode HTTP: ${response.status}`);
            }
            return response.blob(); // Ubah respons menjadi blob.
        })
        .then(blob => {
            const link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = savePath; // Atur nama file yang diunduh.
            document.body.appendChild(link); // Langkah ini memastikan tautan ada dalam dokumen.
            link.click(); // Simulasikan klik pada tautan unduh.
            link.remove(); // Hapus tautan setelah pengunduhan selesai.
            console.log("Pengunduhan selesai!");
        })
        .catch(error => {
            console.error("Terjadi error saat mengunduh:", error);
        });

    Android-Java

    import android.os.AsyncTask;
    import android.os.Environment;
    import java.io.BufferedInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    public class DownloadTask extends AsyncTask<String, String, String> {
        @Override
        protected String doInBackground(String... params) {
            String fileURL = params[0];
            String savePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/myfile.txt"; // Jalur penyimpanan yang dimodifikasi.
            try {
                URL url = new URL(fileURL);
                HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
                httpConn.setRequestMethod("GET");
                int responseCode = httpConn.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    InputStream inputStream = new BufferedInputStream(httpConn.getInputStream());
                    FileOutputStream outputStream = new FileOutputStream(savePath);
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, bytesRead);
                    }
                    outputStream.close();
                    inputStream.close();
                    return "Pengunduhan selesai!";
                } else {
                    return "Tidak ada file untuk diunduh. Server merespons dengan kode HTTP: " + responseCode;
                }
            } catch (Exception e) {
                return "Terjadi error saat mengunduh: " + e.getMessage();
            }
        }
    }

    Objective-C

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // Definisikan URL file dan jalur penyimpanan. Ubah jalur ke jalur yang valid.
            NSString *fileURL = @"https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI5************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a939feb8d79a389572719f7e2939939936d0**********";
            NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // Ganti your_username dengan username Anda.
            
            // Buat objek URL.
            NSURL *url = [NSURL URLWithString:fileURL];
            
            // Buat tugas unduh.
            NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                // Tangani error.
                if (error) {
                    NSLog(@"Terjadi error saat mengunduh: %@", error.localizedDescription);
                    return;
                }
                
                // Periksa data.
                if (!data) {
                    NSLog(@"Tidak ada data yang diterima.");
                    return;
                }
                
                // Simpan file.
                NSError *writeError = nil;
                BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError];
                if (success) {
                    NSLog(@"Pengunduhan selesai!");
                } else {
                    NSLog(@"Terjadi error saat menyimpan file: %@", writeError.localizedDescription);
                }
            }];
            
            // Mulai tugas.
            [task resume];
            
            // Pertahankan thread utama agar permintaan asinkron dapat diselesaikan.
            [[NSRunLoop currentRunLoop] run];
        }
        return 0;
    }

Skenario lain

Hasilkan URL yang ditandatangani yang mengandung versionId

Kode berikut menunjukkan cara menghasilkan URL yang ditandatangani yang mencakup versionId.

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
use OSS\Credentials\EnvironmentVariableCredentialsProvider;

// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$provider = new EnvironmentVariableCredentialsProvider();
// Atur yourEndpoint ke Titik Akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Titik Akhir menjadi https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "yourEndpoint";
// Tentukan nama bucket.
$bucket= "examplebucket";
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket.
$object = "exampleobject.txt";
// Atur waktu kedaluwarsa URL yang ditandatangani menjadi 600 detik. Nilai maksimum adalah 32400 detik.
$timeout = 600;
try{
  $config = array(
      "provider" => $provider,
      "endpoint" => $endpoint,
      "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
      "region"=> "cn-hangzhou"
  );
  $ossClient = new OssClient($config);
  $options = array(
      // Tentukan versionId objek.
      $ossClient::OSS_VERSION_ID=>"CAEQEhiBgIDmgPf8mxgiIDA1YjZlNDIxY2ZmMzQ1MmU5MTM1Y2M4Yzk4NjIx****"
  );
  // Hasilkan URL yang ditandatangani.
  $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
  print_r($signedUrl);
} catch(OssException $e) {
  printf($e->getMessage() . "\n");
}

Hasilkan URL yang ditandatangani untuk pengunduhan menggunakan nama domain kustom

Contoh kode berikut menunjukkan cara menggunakan nama domain kustom untuk menghasilkan URL yang ditandatangani untuk permintaan GET.

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
use OSS\Credentials\EnvironmentVariableCredentialsProvider;

// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$provider = new EnvironmentVariableCredentialsProvider();
// Atur yourEndpoint ke Titik Akhir wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur Titik Akhir menjadi http://static.example.com.
$endpoint = "http://static.example.com";
// Tentukan nama bucket.
$bucket= "examplebucket";
// Tentukan jalur lengkap objek. Jangan sertakan nama bucket.
$object = "exampleobject.txt";
// Atur waktu kedaluwarsa URL yang ditandatangani menjadi 600 detik. Nilai maksimum adalah 32400 detik.
$timeout = 600;
try {
    $config = array(  
        "provider" => $provider,
        "endpoint" => $endpoint,
        'signatureVersion'=>OssClient::OSS_SIGNATURE_VERSION_V4,
        "cname"	=> true,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
    // Hasilkan URL yang ditandatangani.
    $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET");
    print_r($signedUrl);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": GAGAL\n");
    printf($e->getMessage() . "\n");
    return;
}