All Products
Search
Document Center

Object Storage Service:Download an object using a presigned URL (Go SDK V2)

Last Updated:Aug 02, 2025

By default, the access control list (ACL) of an object in an Object Storage Service (OSS) bucket is private. Only the object owner has permission to access the object. This topic describes how to use the OSS SDK for Go to generate a presigned URL that allows a user to temporarily download the object using an HTTP GET request. The URL is valid for a specified period, during which the user can download the object multiple times. After the URL expires, the user must obtain a new presigned URL.

Notes

  • The sample code in this topic uses the region ID cn-hangzhou for the China (Hangzhou) region. By default, a public endpoint is used to access bucket resources. If you access bucket resources from other Alibaba Cloud services in the same region, use an internal endpoint. For more information about OSS regions and endpoints, see Regions and endpoints.

  • In this topic, access credentials are retrieved from environment variables. For more information about how to configure access credentials, see Configure access credentials.

  • You do not need specific permissions to generate a presigned URL. However, to allow others to use the presigned URL to download an object, you must have the oss:GetObject permission. For more information, see Common examples of RAM policies.

  • In this topic, V4 presigned URLs are used. These URLs have a maximum validity period of seven days. For more information, see (Recommended) Include a V4 signature in a URL.

Process

The following flowchart shows how to download an object by using a presigned URL.

image

Method definition

You can call a specific operation to generate a presigned URL that grants temporary access permissions to objects in a bucket. The presigned URL can be used multiple times before it expires.

The following code shows the syntax of the presign operation:

func (c *Client) Presign(ctx context.Context, request any, optFns ...func(*PresignOptions)) (result *PresignResult, err error)

Request parameters

Parameter

Type

Description

ctx

context.Context

The context of the request.

request

*GetObjectRequest

The name of the API operation that is used to generate a presigned URL.

optFns

...func(*PresignOptions)

The validity period of the presigned URL. If you do not specify this parameter, the presigned URL uses the default value, which is 15 minutes. This parameter is optional.

The following table describes the options for PresignOptions.

Option

Type

Description

Expires

time.Duration

The validity period of the presigned URL. For example, if you want to set the validity period to 30 minutes, set Expires to 30 * time.Minute.

Expiration

time.Time

The absolute expiration time of the presigned URL.

Important

If you use the V4 signature algorithm, the validity period can be up to seven days. If you specify both Expiration and Expires, Expiration takes precedence.

Response parameters

Response Property

Type

Description

result

*PresignResult

The returned results, including the presigned URL, HTTP method, validity period, and request headers specified in the request.

err

error

The status of the request. If the request fails, the value of err cannot be nil.

The following table describes the response parameters of PresignResult.

Parameter

Type

Description

Method

string

The HTTP method, which corresponds to the operation. For example, the HTTP method of the GetObject operation is GET.

URL

string

The presigned URL.

Expiration

time.Time

The expiration time of the presigned URL.

SignedHeaders

map[string]string

The request headers specified in the request. For example, if the value of the Content-Type header is specified, information about Content-Type is returned.

Sample code

  1. The following sample code shows how an object owner can generate a presigned URL that allows HTTP GET requests:

    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" ) // Define global variables. var (	region string // The region in which the bucket is located.	bucketName string // The name of the bucket.	objectName string // The name of the object. ) // The init function is used to initialize command-line parameters. func init() {	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")	flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() {	// Parse command-line parameters.	flag.Parse()	// Check whether the bucket name is empty.	if len(bucketName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, bucket name required")	}	// Check whether the region is empty.	if len(region) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, region required")	}	// Check whether the object name is empty.	if len(objectName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, object name required")	}	// Load the default configurations and specify the credential provider and region.	cfg := oss.LoadDefaultConfig().	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).	WithRegion(region)	// Create an OSS client.	client := oss.NewClient(cfg)	// Generate a presigned URL for the GetObject request.	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 {	// If the returned result contains signed headers, you must include the corresponding request headers when you send a GET request using the presigned URL. Otherwise, the request may fail or a signature error may occur.	log.Printf("signed headers:\n")	for k, v := range result.SignedHeaders {	log.Printf("%v: %v\n", k, v)	}	} } 
  2. Other users can download the file using the presigned URL for GET requests.

    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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"

    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) { // Specify the presigned URL that allows HTTP GET requests. 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; // Specify the path in which the downloaded object is stored, including the object name and extension. String savePath = "C:/downloads/myfile.txt"; try { downloadFile(fileURL, savePath); System.out.println("Download completed!"); } catch (IOException e) { System.err.println("Error during download: " + 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"); // Specify the response code. int responseCode = httpConn.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { // Configure the input stream. InputStream inputStream = new BufferedInputStream(httpConn.getInputStream()); // Configure the output stream. FileOutputStream outputStream = new FileOutputStream(savePath); byte[] buffer=new byte[4096]; // Specify the size of the buffer. int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } else { System.out.println("No file to download. Server replied HTTP code: " + 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; 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("Download completed!"); }); } else { console.error(`Download failed. Server responded with code: ${response.statusCode}`); } }).on('error', (err) => { console.error("Error during download:", 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************" 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("Download completed!") else: print(f"No file to download. Server replied HTTP code: {response.status_code}") except Exception as e: print("Error during download:", 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************" 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("Download completed!") } else { println("No file to download. Server replied HTTP code:", 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; const savePath = "C:/downloads/myfile.txt"; // Specify the name of the downloaded object. fetch(fileURL) .then(response => { if (!response.ok) { throw new Error(`Server replied HTTP code: ${response.status}`); } return response.blob(); // Change the type of the response to blob. }) .then(blob => { const link = document.createElement('a'); link.href = window.URL.createObjectURL(blob); link.download=savePath; // Specify the name of the downloaded object. document.body.appendChild(link); // This step ensures that the presigned URL exists in the document. link.click(); // Click the presigned URL to simulate the object download. link.remove(); // Remove the presigned URL after the object is downloaded. console.log("Download completed!"); }) .catch(error => { console.error("Error during download:", 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"; // Specify the path in which you want to store the downloaded object. 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 "Download completed!"; } else { return "No file to download. Server replied HTTP code: " + responseCode; } } catch (Exception e) { return "Error during download: " + e.getMessage(); } } }

    Objective-C

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // Specify the presigned URL and the path in which you want to store the object. 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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"; NSString *savePath = @"/Users/your_username/Desktop/myfile.txt"; // Replace your_username with your username. // Create a URL object. NSURL *url = [NSURL URLWithString:fileURL]; // Create an object download task. NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // Handle errors. if (error) { NSLog(@"Error during download: %@", error.localizedDescription); return; } // Check the data in the object. if (!data) { NSLog(@"No data received."); return; } // Save the object. NSError *writeError = nil; BOOL success = [data writeToURL:[NSURL fileURLWithPath:savePath] options:NSDataWritingAtomic error:&writeError]; if (success) { NSLog(@"Download completed!"); } else { NSLog(@"Error saving file: %@", writeError.localizedDescription); } }]; // Start the object download task. [task resume]; // Continue to run the main thread to complete the asynchronous request. [[NSRunLoop currentRunLoop] run]; } return 0; }

Common scenarios

Generate a presigned URL that allows the HTTP GET requests for a specific version of an object

The following sample code shows how to generate a presigned URL that allows HTTP GET requests for a specific version of an object:

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" ) // Define global variables. var (	region string // The region in which the bucket is located.	bucketName string // The name of the bucket.	objectName string // The name of the object. ) // The init function is used to initialize command-line parameters. func init() {	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")	flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() {	// Parse command-line parameters.	flag.Parse()	// Check whether the bucket name is empty.	if len(bucketName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, bucket name required")	}	// Check whether the region is empty.	if len(region) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, region required")	}	// Check whether the object name is empty.	if len(objectName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, object name required")	}	// Load the default configurations and specify the credential provider and region.	cfg := oss.LoadDefaultConfig().	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).	WithRegion(region)	// Create an OSS client.	client := oss.NewClient(cfg)	// Generate a presigned URL for the GetObject request.	result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{	Bucket: oss.Ptr(bucketName),	Key: oss.Ptr(objectName),	VersionId: oss.Ptr("yourVersionId"), // Specify the version ID.	},	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) } 

Use a presigned URL that contains specific request headers to download an object

If you specify request headers when you generate a presigned URL, you must include the same request headers in the GET request that uses the presigned URL. This is required to prevent request failures and signature errors.

  1. Generate a presigned URL that contains specific request headers and allows HTTP GET requests.

    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" ) // Define global variables. var (	region string // The region in which the bucket is located.	bucketName string // The name of the bucket.	objectName string // The name of the object. ) // The init function is used to initialize command-line parameters. func init() {	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")	flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() {	// Parse command-line parameters.	flag.Parse()	// Check whether the bucket name is empty.	if len(bucketName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, bucket name required")	}	// Check whether the region is empty.	if len(region) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, region required")	}	// Check whether the object name is empty.	if len(objectName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, object name required")	}	// Load the default configurations and specify the credential provider and region.	cfg := oss.LoadDefaultConfig().	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).	WithRegion(region)	// Create an OSS client.	client := oss.NewClient(cfg)	// Generate a presigned URL for the GetObject request.	result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{	Bucket: oss.Ptr(bucketName),	Key: oss.Ptr(objectName),	RangeBehavior: oss.Ptr("standard"),	RequestPayer: oss.Ptr("requestpayer"),	},	)	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 {	// If the returned result contains signed headers, you must specify the corresponding request headers when you send a GET request using the signed URL.	log.Printf("signed headers:\n")	for k, v := range result.SignedHeaders {	log.Printf("%v: %v\n", k, v)	}	} } 
  2. Use the presigned URL and specify the same request headers in the request to download the object.

    curl -X GET "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?x-oss-date=20241113T093321Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************&x-oss-signature=ed5a******************************************************" \ -H "x-oss-range-behavior: standard" \ -H "x-oss-request-payer: requester" \ -o "myfile.txt"
    package main import (	"io"	"log"	"net/http"	"os" ) func main() {	// Specify the generated presigned URL.	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=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"	// Download the file using the HTTP GET method with the generated presigned URL.	req, err := http.NewRequest(http.MethodGet, url, nil)	if err != nil {	log.Fatalf("Failed to create PUT request: %v", err)	}	// Set the request headers.	req.Header.Set("X-Oss-Range-Behavior", "standard")	req.Header.Set("X-Oss-Request-Payer", "requester")	// Initiate the request.	client := &http.Client{}	resp, err := client.Do(req)	if err != nil {	log.Fatalf("Failed to upload file: %v", err)	}	defer resp.Body.Close()	// Define the local path to which the file is written.	filePath := "C:/downloads/myfile.txt"	// Create or open the local file.	file, err := os.Create(filePath)	if err != nil {	log.Fatalf("failed to create or open file: %v", err)	}	defer file.Close() // Make sure that the file is closed when the function is complete.	// Use io.Copy to write the file content to the local file.	n, err := io.Copy(file, resp.Body)	if err != nil {	log.Fatalf("failed to read object %v", err)	}	// Close the response body.	err = resp.Body.Close()	if err != nil {	log.Printf("failed to close response body: %v", err)	}	log.Printf("wrote %d bytes to file: %s\n", n, filePath) } 

Use a presigned URL to force an object download

  1. Generate a signed URL with the response-content-disposition parameter.

    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" ) // Define global variables. var (	region string // The region in which the bucket is located.	bucketName string // The name of the bucket.	objectName string // The name of the object. ) // The init function is used to initialize command-line parameters. func init() {	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")	flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() {	// Parse command-line parameters.	flag.Parse()	// Check whether the bucket name is empty.	if len(bucketName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, bucket name required")	}	// Check whether the region is empty.	if len(region) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, region required")	}	// Check whether the object name is empty.	if len(objectName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, object name required")	}	// Load the default configurations and specify the credential provider and region.	cfg := oss.LoadDefaultConfig().	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).	WithRegion(region)	// Create an OSS client.	client := oss.NewClient(cfg)	// Generate a presigned URL for the GetObject request.	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 {	// If the returned result contains signed headers, you must specify the corresponding request headers when you send a GET request using the signed URL.	log.Printf("signed headers:\n")	for k, v := range result.SignedHeaders {	log.Printf("%v: %v\n", k, v)	}	} } 

  2. Download files directly using a signed URL with a query parameter.

    curl -X GET "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?response-content-disposition=attachment%3B%20filename%3Dtest.txt&x-oss-date=20241113T093321Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************&x-oss-signature=ed5a******************************************************" \ -o "myfile.txt"
    package main import (	"io"	"log"	"net/http"	"os" ) func main() {	// Specify the generated presigned URL.	url := "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/exampleobject.txt?response-content-disposition=attachment%3B%20filename%3Dtest.txt&x-oss-date=20241112T092756Z&x-oss-expires=3599&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI****************/20241112/cn-hangzhou/oss/aliyun_v4_request&x-oss-signature=ed5a******************************************************"	// Download the file using the HTTP GET method with the generated presigned URL.	req, err := http.NewRequest(http.MethodGet, url, nil)	if err != nil {	log.Fatalf("Failed to create PUT request: %v", err)	}	// Initiate the request.	client := &http.Client{}	resp, err := client.Do(req)	if err != nil {	log.Fatalf("Failed to upload file: %v", err)	}	defer resp.Body.Close()	// Define the local path to which the file is written.	filePath := "C:/downloads/myfile.txt"	// Create or open the local file.	file, err := os.Create(filePath)	if err != nil {	log.Fatalf("failed to create or open file: %v", err)	}	defer file.Close() // Make sure that the file is closed when the function is complete.	// Use io.Copy to write the file content to the local file.	n, err := io.Copy(file, resp.Body)	if err != nil {	log.Fatalf("failed to read object %v", err)	}	// Close the response body.	err = resp.Body.Close()	if err != nil {	log.Printf("failed to close response body: %v", err)	}	log.Printf("wrote %d bytes to file: %s\n", n, filePath) } 

Generate a presigned URL using a custom domain name

The following sample code shows how to generate a presigned URL using a custom domain name.

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" ) // Define global variables. var (	region string // The region in which the bucket is located.	bucketName string // The name of the bucket.	objectName string // The name of the object. ) // The init function is used to initialize command-line parameters. func init() {	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")	flag.StringVar(&objectName, "object", "", "The name of the object.") } func main() {	// Parse command-line parameters.	flag.Parse()	// Check whether the bucket name is empty.	if len(bucketName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, bucket name required")	}	// Check whether the region is empty.	if len(region) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, region required")	}	// Check whether the object name is empty.	if len(objectName) == 0 {	flag.PrintDefaults()	log.Fatalf("invalid parameters, object name required")	}	// Load the default configurations and specify the credential provider and region.	cfg := oss.LoadDefaultConfig().	WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).	WithRegion(region).	WithEndpoint("http://static.example.com").	WithUseCName(true)	// Create an OSS client.	client := oss.NewClient(cfg)	// Generate a presigned URL for the GetObject request.	result, err := client.Presign(context.TODO(), &oss.GetObjectRequest{	Bucket: oss.Ptr(bucketName),	Key: oss.Ptr(objectName),	//RequestPayer: oss.Ptr("requester"), // Specify the identity of the requester.	},	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 {	// If you specify request headers when you generate a presigned URL that allows HTTP GET requests, make sure that the request headers are included in the GET request initiated using the presigned URL. This prevents request failures and signature errors.	log.Printf("signed headers:\n")	for k, v := range result.SignedHeaders {	log.Printf("%v: %v\n", k, v)	}	} }

References

  • For the complete sample code that is used to download an object using a presigned URL, see the GitHub example.

  • For more information about the API operation that you can call to download an object using a presigned URL, see Presign.