全部產品
Search
文件中心

Object Storage Service:使用檔案URL分享檔案

更新時間:Jul 24, 2024

預設情況下,OSS儲存空間中檔案的讀寫權限是私人,僅檔案擁有者具有訪問檔案的許可權。但是,檔案擁有者可以通過建立簽名URL的方式與第三方使用者分享檔案,簽名URL使用安全憑證的方式授權第三方使用者在指定時間內下載或者預覽檔案。

注意事項

  • 產生簽名URL過程中,SDK利用本機存放區的密鑰資訊,根據特定演算法計算出簽名(signature),然後將其附加到URL上,以確保URL的有效性和安全性。這一系列計算和構造URL的操作都是在用戶端完成,不涉及網路請求到服務端。因此,產生簽名URL時不需要授予調用者特定許可權。但是,為避免第三方使用者無法對簽名URL授權的資源執行相關操作,需要確保調用產生簽名URL介面的身份主體被授予對應的許可權。

    例如,通過簽名URL下載或預覽檔案時,需要授予oss:GetObject許可權。

  • 如需確保通過檔案URL訪問檔案時是預覽行為,您需要綁定自訂網域名並添加CNAME記錄。詳情請參見綁定自訂網域名至Bucket預設網域名稱

  • 擷取私人檔案URL時涉及設定URL的有效時間長度。超出檔案URL設定的有效時間長度後,通過檔案URL訪問時會提示簽名URL已到期,導致無法正常訪問檔案。如果您希望繼續訪問該檔案,需要選擇以下任意方式重新擷取簽名URL。

擷取單個檔案的URL

私人檔案

如果檔案讀寫權限ACL為私人,則必須進行簽名操作。私人檔案URL的格式為https://BucketName.Endpoint/Object?簽名參數。您可以通過以下任意方法擷取檔案URL並設定URL的有效時間長度。

重要

檔案URL的有效時間長度因帳號類型存在差異。例如,阿里雲帳號通過OSS控制台可設定的檔案URL有效時間長度最大為32400秒(9小時),RAM使用者以及STS使用者可設定的檔案URL有效時間長度最大為3600秒(1小時)。如需擷取更長時效的檔案URL,請使用命令列工具ossutil、圖形化管理工具ossbrowser或阿里雲SDK。更多資訊,請參見私人檔案簽名URL有效時間長度

使用OSS控制台

您可以通過OSS控制台擷取單個檔案的URL。

  1. 登入OSS管理主控台

  2. 單擊Bucket列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇文件管理 > 檔案清單

  4. 擷取檔案URL。

    1. 單擊目標檔案名稱。

    2. 詳情面板配置以下參數,然後單擊復制文件 URL複製URL

      參數

      說明

      到期時間

      當目標檔案為私人檔案時,需設定檔案URL的有效時間。

      取值範圍:60~32400

      單位:秒

      如果您希望設定更長到期時間的檔案URL,您可以使用ossbrowser、sdk、ossutil等工具。

      自有域名

      如需確保第三方訪問圖片或網頁檔案時是預覽行為,請使用Bucket綁定的自訂網域名組建檔案URL。

      僅當Bucket綁定自訂網域名後可配置此項。更多資訊,請參見綁定自訂網域名

      使用HTTPS

      預設使用HTTPS協議組建檔案URL。如需使用HTTP協議組建檔案URL,請關閉使用HTTPS開關。

使用圖形化管理工具ossbrowser

ossbrowser支援Object層級的操作與控制台支援的操作類似,請按照ossbrowser介面指引完成擷取簽名URL的操作。關於如何使用ossbrowser,請參見快速使用ossbrowser

使用阿里雲SDK

以下僅列舉常見SDK的產生簽名URL並使用簽名URL下載檔案的程式碼範例。關於其他SDK的產生簽名URL並使用簽名URL下載檔案的程式碼範例,請參見SDK簡介

Java

  1. 產生下載檔案的簽名URL。

    import com.aliyun.oss.*;
    import com.aliyun.oss.common.auth.*;
    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 {
            // 以華東1(杭州)的外網Endpoint為例,其它Region請按實際情況填寫。
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // 填寫Bucket名稱,例如examplebucket。
            String bucketName = "examplebucket";
            // 填寫Object完整路徑,例如exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
            String objectName = "exampleobject.txt";
    
            // 建立OSSClient執行個體。
            OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
    
            URL signedUrl = null;
            try {
                // 指定產生的簽名URL到期時間,單位為毫秒。本樣本以設定到期時間為1小時為例。
                Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
    
                // 產生簽名URL。
                GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
                // 設定到期時間。
                request.setExpiration(expiration);
    
                // 通過HTTP GET請求產生簽名URL。
                signedUrl = ossClient.generatePresignedUrl(request);
                // 列印簽名URL。
                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());
            }
        }
    }
  2. 使用簽名URL下載檔案。

    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import java.io.*;
    import java.util.*;
    
    public class Get1 {
        public static void main(String[] args) throws Throwable {        
            // 填寫下載到本地檔案的完整路徑。
            String pathName = "D:\\example.jpg";
            // 填寫步驟1產生的簽名URL。
            String signedUrl= "yourSignedUrl";
    
            Map<String, String> headers = new HashMap<String, String>();
            Map<String, String> userMetadata = new HashMap<String, String>();
    
            // 通過簽名URL下載檔案,以HttpClients為例說明。
            getObjectWithHttp(signedUrl, pathName, headers, userMetadata);
        }
    
        public static void getObjectWithHttp(String signedUrl, String pathName, Map<String, String> headers, Map<String, String> userMetadata) throws IOException {
            CloseableHttpClient httpClient = null;
            CloseableHttpResponse response = null;
            try {
                HttpGet get = new HttpGet(signedUrl);
    
                // 如果產生簽名URL時設定了header參數,例如使用者中繼資料,儲存類型等,則呼叫簽章URL下載檔案時,也需要將這些參數發送至服務端。如果簽名和發送至服務端的不一致,會報簽名錯誤。
                for(Map.Entry header: headers.entrySet()){
                    get.addHeader(header.getKey().toString(),header.getValue().toString());
                }
                for(Map.Entry meta: userMetadata.entrySet()){
                    // 如果使用userMeta,sdk內部會為userMeta拼接"x-oss-meta-"首碼。當您使用其他方式產生簽名URL進行下載時,userMeta也需要拼接"x-oss-meta-"首碼。
                    get.addHeader("x-oss-meta-"+meta.getKey().toString(), meta.getValue().toString());
                }
    
                httpClient = HttpClients.createDefault();
                response = httpClient.execute(get);
    
                System.out.println("返回下載狀態代碼:"+response.getStatusLine().getStatusCode());
                if(response.getStatusLine().getStatusCode() == 200){
                    System.out.println("使用網路程式庫下載成功");
                }
                System.out.println(response.toString());
    
                saveFileToLocally(response.getEntity().getContent(), pathName);
            } catch (Exception e){
                e.printStackTrace();
            } finally {
                response.close();
                httpClient.close();
            }
        }
    
        public static void saveFileToLocally(InputStream inputStream, String pathName) throws IOException {
            DataInputStream in = null;
            OutputStream out = null;
            try {
                in = new DataInputStream(inputStream);
                out = new DataOutputStream(new FileOutputStream(pathName));
                int bytes = 0;
                byte[] bufferOut = new byte[1024];
                while ((bytes = in.read(bufferOut)) != -1) {
                    out.write(bufferOut, 0, bytes);
                }
            } catch (Exception e){
                e.printStackTrace();
            } finally {
                in.close();
                out.close();
            }
        }
    }

PHP

  1. 產生下載檔案的簽名URL。

    <?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\Credentials\EnvironmentVariableCredentialsProvider; 
    use OSS\OssClient;
    use OSS\Core\OssException;
    use OSS\Http\RequestCore;
    use OSS\Http\ResponseCore;
     
    // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    $provider = new EnvironmentVariableCredentialsProvider();
    // yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
    $endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 填寫Bucket名稱,例如examplebucket。
    $bucket= "examplebucket";
    // 填寫不包含Bucket名稱在內的Object完整路徑。
    $object = "exampleobject.txt";
    // 設定簽名URL的有效時間長度為3600秒。
    $timeout = 3600;
    // 產生下載的簽名URL。
    $options = array(
        "response-content-disposition"=>"attachment",
    );
    try {
        $config = array(
            "provider" => $provider,
            "endpoint" => $endpoint,        
        );
        $ossClient = new OssClient($config);
        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout,'GET',$options);
     
    } catch (OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": signedUrl: " . $signedUrl . "\n");
  2. 使用簽名URL下載檔案。

    <?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\Http\RequestCore;
    use OSS\Http\ResponseCore;
    // 填寫步驟1產生的簽名URL。
    $signedUrl = 'yourSignedUrl';
    // 填寫下載到本地檔案的完整路徑。
    $localfile = "D://example.txt";
    // 使用簽名URL下載檔案。
    $request = new RequestCore($signedUrl);
    // 產生的簽名URL預設以GET方式訪問。
    $request->set_method('GET');
    $request->add_header('Content-Type', '');
    $request->send_request();
    $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
    if ($res->isOK()) {
        print(__FUNCTION__ . ": OK" . "\n");
    	 file_put_contents($localfile,$request->get_response_body());
    } else {
        print(__FUNCTION__ . ": FAILED" . "\n");
    };   

Node.js

  1. 產生下載檔案的簽名URL。

    const OSS = require("ali-oss");
    const client = new OSS({
      // yourRegion填寫Bucket所在地區。以華東1(杭州)為例,yourRegion填寫為oss-cn-hangzhou。
      region: "oss-cn-hangzhou",
      // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      // 填寫Bucket名稱,例如examplebucket。
      bucket: "examplebucket",
    });
    // 產生用於下載檔案的簽名URL,並指定簽名URL的到期時間為3600秒。
    const url = client.signatureUrl("exampleobject.txt", { expires: 3600 });
    console.log(url);
  2. 通過簽名URL下載檔案。

    const axios = require("axios");
    const fs = require("fs");
    // 填寫步驟1產生的簽名URL。
    const url = "yourSignedUrl";
    // 填寫下載到本地檔案的完整路徑。
    const file = "D://example.txt";
    
    axios
      // 設定響應類型為arraybuffer。
      .get(url, { responseType: "arraybuffer" }) 
      .then((response) => {
        fs.writeFile(file, response.data, (err) => {
          if (err) {
            console.log(err);
          } else {
            console.log("檔案下載成功");
          }
        });
      })
      .catch((error) => {
        console.log(error);
      });

Python

  1. 產生下載檔案的簽名URL。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    import requests
    
    # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    
    # yourEndpoint填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
    # 填寫Bucket名稱,例如examplebucket。
    bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
    # 填寫Object完整路徑,例如exampledir/exampleobject.txt。Object完整路徑中不能包含Bucket名稱。
    object_name = 'exampleobject.txt'
    
    # 產生下載檔案的簽名URL,有效時間為3600秒。
    # 設定slash_safe為True,OSS不會對Object完整路徑中的正斜線(/)進行轉義,此時產生的簽名URL可以直接使用。
    url = bucket.sign_url('GET', object_name, 3600, slash_safe=True)
    print('簽名URL的地址為:', url)
  2. 通過簽名URL下載檔案。

    # -*- coding: utf-8 -*-
    import oss2
    import requests
    # 填寫步驟1產生的簽名URL。
    url = 'yourSignedUrl'
    
    # 通過簽名URL下載檔案,以requests為例說明。
    resp = requests.get(url)
    
    # 填寫下載到本地檔案的完整路徑。
    with open("D:\\examplefile.txt", "wb") as code:
        code.write(resp.content)

Browser.js

  1. 產生下載檔案的簽名URL。

    const OSS = require("ali-oss");
    const STS = require("ali-oss").STS;
    // const cors = require("cors");
    
    const stsClient = new STS({
      // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    });
    // 填寫儲存空間名稱,例如examplebucket。
    const bucket = "examplebucket";
    // yourRegion填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為oss-cn-hangzhou。
    const region = "oss-cn-hangzhou";
    // 指定角色ARN。
    const roleArn = "acs:ram::137918634953****:role/ossram";
    const getSts = () => {
      stsClient
        .assumeRole(
          roleArn,
          `{
            "Statement": [
              {
                "Effect": "Allow",
                "Action": "*",
                "Resource": [
                  "acs:oss:*:*:examplebucket/*"
                ]
              }
            ]
          }`,
          3000 //指定SecurityToken到期時間,單位為秒。
        )
        .then((r) => {
          console.log("send:", r.credentials);
          const { SecurityToken, AccessKeyId, AccessKeySecret } = r.credentials;
          const client = new OSS({
            bucket,
            region,
            accessKeyId: AccessKeyId,
            accessKeySecret: AccessKeySecret,
            stsToken: SecurityToken,
            refreshSTSTokenInterval: 9000,
          });
          // 產生下載檔案的簽名URL。
          const url = client.asyncSignatureUrl("exampleobject.txt", {
            expires: 3600,
            method: "GET",
          });
          console.log("url:", url);
          // client.get("exampleobject.txt", Buffer.from("body")).then((res) => {
          //   console.log("res", res.url);
          // });
        });
    };
    getSts();
    
  2. 使用簽名URL下載檔案。

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <title>Document</title>
      </head>
      <body>
        <script src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.18.0.min.js"></script>
        <script>
          // 填寫步驟1產生的簽名URL。
          const url = "yourSignedUrl";
          var xhr = new XMLHttpRequest();
          xhr.open("GET", url, true);
          // 設定響應類型為blob。
          xhr.responseType = "blob"; 
          xhr.onload = function () {
            if (xhr.status === 200) {
              const blob = xhr.response;
              const reader = new FileReader();
              reader.onloadend = function () {
                const fileData = reader.result;
                // 自訂下載到本地檔案的名稱。
                const file = new File([fileData], "examplefile.txt");
                const a = document.createElement("a");
                a.href = URL.createObjectURL(file);
                a.download = file.name;
                a.click();
              };
              reader.readAsArrayBuffer(blob);
            } else {
              console.log("請求失敗");
            }
          };
          xhr.send();
        </script>
      </body>
    </html>

Android

  1. 產生下載檔案的簽名URL。

    // 填寫Bucket名稱,例如examplebucket。
    String bucketName = "examplebucket";
    // 填寫不包含Bucket名稱在內源Object的完整路徑,例如exampleobject.txt。
    String objectKey = "exampleobject.txt";
    String url = null;
    try {
        // 產生用於下載檔案的簽名URL。
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey);
        // 設定簽名URL的到期時間為30分鐘。
        request.setExpiration(30*60);
        request.setMethod(HttpMethod.GET);
        url = oss.presignConstrainedObjectURL(request);
        Log.d("url", url);
    } catch (ClientException e) {
        e.printStackTrace();
    }
  2. 通過簽名URL下載檔案。

    // 填寫產生的簽名URL。
    String url = "";
    OkHttpClient client = new OkHttpClient();
    // 通過簽名URL下載檔案。
    Request getRequest = new Request.Builder()
            .url(url)
            .get()
            .build();
    client.newCall(getRequest).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
    
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.code() == 203 || response.code() >= 300) {
                Log.d("download", "fail");
                Log.d("download", response.body().string());
                return;
            }
            // 請求成功。
            InputStream inputStream = response.body().byteStream();
    
            byte[] buffer = new byte[2048];
            int len;
    
            while ((len = inputStream.read(buffer)) != -1) {
                // 處理下載的資料,例如圖片展示或者寫入檔案等。
            }
        }
    });

Go

  1. 產生下載檔案的簽名URL。

    package main
    
    import (
        "fmt"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
        "os"
    )
    
    func HandleError(err error) {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    
    func main() {
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        provider, err := oss.NewEnvironmentVariableCredentialsProvider()
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
        // 建立OSSClient執行個體。
        // yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
        client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
        if err != nil {
            fmt.Println("Error:", err)
            os.Exit(-1)
        }
    
        // 填寫Bucket名稱,例如examplebucket。
        bucketName := "examplebucket"
        // 填寫檔案完整路徑,例如exampledir/exampleobject.txt。檔案完整路徑中不能包含Bucket名稱。
        objectName := "exampledir/exampleobject.txt"
        // 將Object下載到本地檔案,並儲存到指定的本地路徑中。如果指定的本地檔案存在會覆蓋,不存在則建立。
        bucket, err := client.Bucket(bucketName)
        if err != nil {
            HandleError(err)
        }
    
        // 產生用於下載的簽名URL,並指定簽名URL的有效時間為60秒。
        signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 60)
        if err != nil {
            HandleError(err)
        }
        fmt.Printf("Sign Url:%s\n", signedURL)
    }
  2. 使用簽名URL下載檔案。

    package main
    
    import (
    	"fmt"
    	"os"
    	"github.com/aliyun/aliyun-oss-go-sdk/oss"
    )
    
    func main() {
        // 建立OSSClient執行個體。
        // yourEndpoint填寫Bucket對應的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實際情況填寫。
    	client, err := oss.New("https://oss-cn-hangzhou.aliyuncs.com", "", "")
    	if err != nil {
    		fmt.Println("Error:", err)
    		os.Exit(-1)
    	}
    	
      	// 填寫Bucket名稱,例如examplebucket。
      	bucketName := "examplebucket"
      	// 填寫本地檔案完整路徑。
      	localDownloadedFilename := "D://example.txt"
      
      	bucket, err := client.Bucket(bucketName)
      	if err != nil {
        	HandleError(err)
      	}
      	// 填寫步驟1擷取的簽名URL。
      	signedURL := "yourSignedUrl"
      	// 使用簽名URL將OSS檔案下載到本地檔案。
      	err = bucket.GetObjectToFileWithURL(signedURL, localDownloadedFilename)
      	if err != nil {
        	HandleError(err)
      	}
    }
    
    func HandleError(err error) {
    	fmt.Println("Error:", err)
    	os.Exit(-1)
    }

iOS

  1. 產生下載檔案的簽名URL。

    // 填寫Bucket名稱。
    NSString *bucketName = @"examplebucket";
    // 填寫Object名稱。
    NSString *objectKey = @"exampleobject.txt";
    __block NSString *urlString;
    // 產生用於下載的簽名URL,並指定簽名URL到期時間為30分鐘。
    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;
    }];
  2. 使用簽名URL下載檔案。

    // 使用簽名URL下載檔案。
    NSURL * url = [NSURL URLWithString:urlString];
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    NSURLSession * session = [NSURLSession sharedSession];
    NSURLSessionTask * sessionTask = [session dataTaskWithRequest:request
                                                completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"download error: %@", error);
            return;
        } else if (((NSHTTPURLResponse*)response).statusCode == 203 ||
                   ((NSHTTPURLResponse*)response).statusCode >= 300) {
            NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"download error: %@", body);
            return;
        }
        NSLog(@"download success");
    }];
    [sessionTask resume];

使用命令列工具ossutil

關於使用ossutil產生簽名URL的具體操作, 請參見sign(產生簽名URL)

公用讀取檔案

如果檔案的讀寫權限ACL為公用讀取,即該檔案允許匿名訪問,則檔案URL的格式為https://BucketName.Endpoint/ObjectName。其中,ObjectName需填寫包含檔案夾以及檔案尾碼在內的該檔案的完整路徑。各地區的Endpoint資訊介紹,請參見訪問網域名稱和資料中心

例如華東1(杭州)地區下名為examplebucket的Bucket下有名為example的檔案夾,檔案夾內有個名為example.jpg的檔案。則該檔案URL為:

  • 外網訪問URL:https://examplebucket.oss-cn-hangzhou.aliyuncs.com/example/example.jpg

  • 內網訪問URL(供同地區ECS執行個體訪問):https://examplebucket.oss-cn-hangzhou-internal.aliyuncs.com/example/example.jpg

說明

如果檔案所在的Bucket綁定了自訂網域名,則檔案URL的格式為https://YourDomainName/ObjectName

例如您在華東1(杭州)地區下的examplebucket綁定了自訂網域名example.com,且該Bucket下包含example.jpg的檔案,則該檔案URL為https://example.com/example.jpg

擷取多個檔案的URL

僅OSS控制台支援批量擷取多個檔案的URL。

  1. 選中目標檔案,然後單擊下方的匯出URL列表list

  2. 匯出URL列表面板,配置以下參數:

    參數

    說明

    使用HTTPS

    預設使用HTTPS協議組建檔案URL。如需使用HTTP協議組建檔案URL,請關閉使用HTTPS開關。

    到期時間

    當目標檔案為私人檔案時,需設定檔案URL的有效時間。

    取值範圍:60~32400

    單位:秒

    若您希望擷取更長時效的檔案URL,建議使用命令列工具ossutil圖形化工具ossbrowser

    自有域名

    如需確保第三方訪問圖片或網頁檔案時是預覽行為,請使用Bucket綁定的自訂網域名組建檔案URL。

    僅當Bucket綁定自訂網域名後可配置此項。更多資訊,請參見綁定自訂網域名

    傳輸加速網域名稱

    若第三方涉及跨國或跨洋等超遠距離檔案訪問情境時,建議使用傳輸加速網域名稱組建檔案URL。

    僅當Bucket開啟傳輸加速後可配置此項。更多資訊,請參見開啟傳輸加速

  3. 單擊確定,然後將URL列表檔案儲存到本地。

說明

如果您希望通過命令列管理工具ossutil、阿里雲SDK批量擷取多個檔案的URL時:

  1. 通過GetBucket (ListObjects)介面擷取所有Object的名稱。

  2. 迴圈調用擷取單個檔案的URL方法。具體操作,請參見擷取單個檔案的URL

相關文檔

您可以上傳ECS的鏡像檔案至OSS,然後擷取鏡像檔案URL匯入自訂鏡像。更多資訊,請參見上傳鏡像檔案至OSS匯入自訂鏡像