すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:オブジェクトをローカルファイルにダウンロードする (Go SDK V1)

最終更新日:Nov 29, 2025

このトピックでは、バケットからオブジェクトをローカルファイルにダウンロードする方法について説明します。

注意事項

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。

  • このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。

  • オブジェクトをローカルファイルにダウンロードするには、oss:GetObject 権限が必要です。詳細については、「RAM ユーザーへのカスタムアクセスポリシーの付与」をご参照ください。

サンプルコード

次のコードは、examplebucket バケットの exampledir フォルダにある exampleobject.txt ファイルを、ローカルパス D:\localpath\examplefile.txt にダウンロードする方法の例です。

package main

import (
	"log"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンのバケットの場合は、実際のエンドポイントに設定します。
	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンのバケットの場合は、実際のリージョンに設定します。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// バケット名を指定します (例: examplebucket)。
	bucketName := "examplebucket" // 実際のバケット名に置き換えてください。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket: %v", err)
	}

	// オブジェクトをローカルファイルにダウンロードし、指定されたローカルパスに保存します。指定されたローカルファイルが存在する場合、上書きされます。指定されたローカルファイルが存在しない場合は、作成されます。
	// ローカルパスを指定しない場合、ダウンロードされたファイルはサンプルプログラムが存在するプロジェクトのローカルパスに保存されます。
	// オブジェクトの完全なパス (例: exampledir/exampleobject.txt) とローカルファイルの完全なパス (例: D:\\localpath\\examplefile.txt) を指定します。オブジェクトの完全なパスにバケット名を含めることはできません。
	objectName := "exampledir/exampleobject.txt"
	localFilePath := "D:\\localpath\\examplefile.txt"
	err = bucket.GetObjectToFile(objectName, localFilePath)
	if err != nil {
		log.Fatalf("Failed to download file: %v", err)
	}

	log.Println("File downloaded successfully.")
}

利用シーン

条件付きダウンロード

バケットからオブジェクトをダウンロードする際に、条件を指定できます。これらの条件は、オブジェクトの最終更新時刻または ETag に基づいて設定できます。ETag は、オブジェクトのコンテンツの識別子です。オブジェクトは、指定された条件が満たされた場合にのみダウンロードされます。それ以外の場合は、エラーが返されます。条件付きダウンロードにより、ネットワークトラフィックが削減され、効率が向上します。

OSS は次の条件をサポートしています:

説明
  • If-Modified-Since と If-Unmodified-Since は併用できます。If-Match と If-None-Match も併用できます。

  • ETag を取得するには、ossClient.getObjectMeta メソッドを使用します。

パラメーター

説明

設定方法

IfModifiedSince

指定した時刻がオブジェクトの実際の変更時刻より前の場合、オブジェクトはダウンロードされます。それ以外の場合は、304 Not Modified エラーが返されます。

oss.IfModifiedSince

IfUnmodifiedSince

指定した時刻がオブジェクトの実際の変更時刻と同じかそれ以降の場合、オブジェクトはダウンロードされます。それ以外の場合は、412 Precondition Failed エラーが返されます。

oss.IfUnmodifiedSince

IfMatch

指定した ETag が OSS 内のオブジェクトの ETag と一致する場合、オブジェクトはダウンロードされます。それ以外の場合は、412 Precondition Failed エラーが返されます。

oss.IfMatch

IfNoneMatch

指定した ETag が OSS 内のオブジェクトの ETag と一致しない場合、オブジェクトはダウンロードされます。それ以外の場合は、304 Not Modified エラーが返されます。

oss.IfNoneMatch

次のコードは、条件付きダウンロードを実行する方法の例です。

package main

import (
	"log"
	"time"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Failed to create credentials provider: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンのバケットの場合は、実際のエンドポイントに設定します。
	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンのバケットの場合は、実際のリージョンに設定します。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Failed to create OSS client: %v", err)
	}

	// バケット名を指定します。
	bucketName := "yourBucketName" // 実際のバケット名に置き換えてください。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket: %v", err)
	}

	// オブジェクトが 2023年11月21日 18:43:02 に最終更新されたと仮定します。この時刻より前の UTC 時刻を指定すると、IfModifiedSince 条件が満たされ、ダウンロードがトリガーされます。
	date := time.Date(2023, time.November, 21, 18, 43, 2, 0, time.UTC)

	// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
	objectName := "yourObjectName" // 実際のオブジェクト名に置き換えてください。
	localFilePath := "LocalFile"   // ローカルファイルのパス。

	// 条件が満たされないため、オブジェクトはダウンロードされません。
	err = bucket.GetObjectToFile(objectName, localFilePath, oss.IfUnmodifiedSince(date))
	if err == nil {
		log.Fatal("Expected an error when the condition is not met, but got nil")
	}

	// 条件が満たされたため、オブジェクトはダウンロードされます。
	err = bucket.GetObjectToFile(objectName, localFilePath, oss.IfModifiedSince(date))
	if err != nil {
		log.Fatalf("Failed to download file: %v", err)
	}

	log.Println("File has been downloaded successfully.")
}

ダウンロードのプログレスバーの表示

オブジェクトをダウンロードする際に、プログレスバーを使用してリアルタイムのダウンロード進行状況を確認できます。これにより、タスクをモニターし、長時間の待機中にダウンロードが停止したのではないかという懸念を回避できます。

次のコードは、examplebucket バケットから exampleobject.txt オブジェクトをダウンロードする際にプログレスバーを表示する方法の例です。

package main

import (
	"log"
	"sync/atomic"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

// プログレスリスナーを定義します。
type OssProgressListener struct {
	lastProgress int64
}

// 進行状況変更イベントのハンドラを定義します。
func (listener *OssProgressListener) ProgressChanged(event *oss.ProgressEvent) {
	switch event.EventType {
	case oss.TransferStartedEvent:
		log.Printf("Transfer Started, ConsumedBytes: %d, TotalBytes %d.\n",
			event.ConsumedBytes, event.TotalBytes)
	case oss.TransferDataEvent:
		if event.TotalBytes != 0 {
			progress := int64(event.ConsumedBytes * 100 / event.TotalBytes)
			if progress > atomic.LoadInt64(&listener.lastProgress) {
				atomic.StoreInt64(&listener.lastProgress, progress)
				log.Printf("\rTransfer Data, ConsumedBytes: %d, TotalBytes %d, %d%%.",
					event.ConsumedBytes, event.TotalBytes, progress)
			}
		}
	case oss.TransferCompletedEvent:
		log.Printf("\nTransfer Completed, ConsumedBytes: %d, TotalBytes %d.\n",
			event.ConsumedBytes, event.TotalBytes)
	case oss.TransferFailedEvent:
		log.Printf("\nTransfer Failed, ConsumedBytes: %d, TotalBytes %d.\n",
			event.ConsumedBytes, event.TotalBytes)
	default:
	}
}

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// OSSClient インスタンスを作成します。
	// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンのバケットの場合は、実際のエンドポイントに設定します。
	// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンのバケットの場合は、実際のリージョンに設定します。
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// 署名バージョンを設定します。
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// バケット名を指定します。
	bucketName := "examplebucket"
	// オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。
	objectName := "exampleobject.txt"
	// ローカルファイルの完全なパスを指定します。指定されたローカルファイルが存在する場合、上書きされます。指定されたローカルファイルが存在しない場合は、作成されます。
	// ローカルパスを指定しない場合、ダウンロードされたファイルはサンプルプログラムが存在するプロジェクトのローカルパスに保存されます。
	localFile := "D:\\localpath\\examplefile.txt"

	// バケットを取得します。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// プログレスバー付きでオブジェクトをダウンロードします。
	err = bucket.GetObjectToFile(objectName, localFile, oss.Progress(&OssProgressListener{}))
	if err != nil {
		log.Fatalf("Error: %v", err)
	}
	log.Println("Transfer Completed.")
}

関連ドキュメント

  • オブジェクトをローカルファイルにダウンロードする方法を示す完全なサンプルコードについては、「GitHub」をご参照ください。

  • オブジェクトをローカルファイルにダウンロードするために使用される API 操作の詳細については、「GetObjectToFile」をご参照ください。