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

Object Storage Service:読み取り専用ファイルアクセス (Go SDK V2)

最終更新日:Nov 09, 2025

このトピックでは、Object Storage Service (OSS) SDK for Go 2.0 が提供するファイルのような操作を使用して、バケット内のオブジェクトにアクセスする方法について説明します。

注意事項

  • このトピックのサンプルコードでは、中国 (杭州) リージョン ID の cn-hangzhou を例として使用します。デフォルトではパブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

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

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

メソッド

OSS SDK for Go 2.0 が提供する File-Like 操作を使用すると、ReadOnlyFile メソッドを使用してバケット内のオブジェクトにアクセスできます。

  • ReadOnlyFile メソッドは、シングルストリームモードとプリフェッチモードを提供します。並列タスク数を変更して読み取り速度を向上させることができます。

  • ReadOnlyFile メソッドは再接続メカニズムを提供しており、より複雑なネットワーク環境において堅牢性を備えています。

type ReadOnlyFile struct {
...
}

func (c *Client) OpenFile(ctx context.Context, bucket string, key string, optFns ...func(*OpenOptions)) (file *ReadOnlyFile, err error)

リクエストパラメーター

パラメーター

タイプ

説明

ctx

context.Context

リクエストのコンテキスト。

bucket

string

バケットの名前。

key

string

オブジェクトの名前。

optFns

...func(*OpenOptions)

オプション。オブジェクトを開くときに構成できるオプション。

OpenOptions のオプション

オプション

タイプ

説明

Offset

int64

オブジェクトを開くときの初期オフセット。デフォルト値:0。

VersionId

*string

指定したオブジェクトのバージョン番号。このパラメーターは、オブジェクトの複数のバージョンが存在する場合にのみ有効です。

RequestPayer

*string

リクエスト元支払いモードが有効になっている場合、RequestPayer を requester に設定する必要があります。

EnablePrefetch

bool

プリフェッチモードを有効にするかどうかを指定します。デフォルトでは、プリフェッチモードは無効になっています。

PrefetchNum

int

プリフェッチされるチャンクの数。デフォルト値:3。このパラメーターは、プリフェッチモードが有効になっている場合に有効です。

ChunkSize

int64

プリフェッチされる各チャンクのサイズ。デフォルト値:6 MiB。このパラメーターは、プリフェッチモードが有効になっている場合に有効です。

PrefetchThreshold

int64

プリフェッチモードが有効になる前に順番に読み取られるバイト数。デフォルト値:20 MiB。このパラメーターは、プリフェッチモードが有効になっている場合に有効です。

レスポンスパラメーター

パラメーター

タイプ

説明

file

*ReadOnlyFile

ReadOnlyFile のインスタンス。このパラメーターは、err の値が nil の場合に有効です。詳細については、ReadOnlyFile をご参照ください。

err

error

ReadOnlyFile のステータス。エラーが発生した場合、err の値は nil になりません。

ReadOnlyFile の一般的なメソッド

メソッド

説明

Close() error

ファイルハンドルを閉じて、メモリやアクティブなソケットなどのリソースを解放します。

Read(p []byte) (int, error)

データソースから長さ len(p) のバイトを読み取り、バイトを p に格納し、読み取られたバイト数と発生したエラーを返します。

Seek(offset int64, whence int) (int64, error)

次の読み取りまたは書き込みのオフセットを指定します。whence の有効な値:0:先頭。1:現在のオフセット。2:末尾。

Stat() (os.FileInfo, error)

オブジェクトサイズ、最終更新時刻、メタデータなどのオブジェクト情報をクエリします。

重要

注:プリフェッチモードが有効になっていて、複数の順序外れ読み取りが発生した場合、シングルストリームモードが自動的に使用されます。

シングルストリームモードを使用してオブジェクト全体を読み取る

package main

import (
	"context"
	"flag"
	"io"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を指定します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケットの名前。
	objectName string // オブジェクトの名前。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
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() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// デフォルト設定をロードし、資格情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSSClient インスタンスを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトを開きます。
	f, err := client.OpenFile(context.TODO(), bucketName, objectName)

	if err != nil {
		log.Fatalf("failed to open file %v", err)
	}
	defer f.Close()

	// io.Copy を使用してオブジェクトのコンテンツを読み取ります。
	written, err := io.Copy(io.Discard, f)
	if err != nil {
		log.Fatalf("failed to read file %v", err)
	}

	log.Printf("read %d bytes from file", written)
}

プリフェッチモードを使用してオブジェクト全体を読み取る

package main

import (
	"context"
	"flag"
	"io"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を指定します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケットの名前。
	objectName string // オブジェクトの名前。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
	flag.StringVar(&region, "region", "", "バケットが配置されているリージョン。")
	flag.StringVar(&bucketName, "bucket", "", "バケットの名前。")
	flag.StringVar(&objectName, "object", "", "オブジェクトの名前。")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター、バケット名が必要です")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター、リージョンが必要です")
	}

	// オブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("無効なパラメーター、オブジェクト名が必要です")
	}

	// デフォルトの構成を読み込み、認証情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSSClient インスタンスを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトを開きます。
	f, err := client.OpenFile(context.TODO(),
		bucketName,
		objectName,
		func(oo *oss.OpenOptions) {
			oo.EnablePrefetch = true // プリフェッチモードを有効にします。
		})

	if err != nil {
		log.Fatalf("ファイルを開けませんでした %v", err)
	}

	defer f.Close()

	// オブジェクトを読み取ります。
	written, err := io.Copy(io.Discard, f)

	if err != nil {
		log.Fatalf("ファイルの読み取りに失敗しました %v", err)
	}

	log.Printf("ファイルから %d バイトを読み取りました", written)
}

Seek メソッドを使用して特定の位置から残りのデータを読み取る

package main

import (
	"context"
	"flag"
	"io"
	"log"
	"net/http"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を指定します。
var (
	region     string // バケットが配置されているリージョン。
	bucketName string // バケットの名前。
	objectName string // オブジェクトの名前。
)

// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
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() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// オブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, object name required")
	}

	// デフォルト設定をロードし、資格情報プロバイダーとリージョンを指定します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSSClient インスタンスを作成します。
	client := oss.NewClient(cfg)

	// オブジェクトを開きます。
	f, err := client.OpenFile(context.TODO(), bucketName, objectName)

	if err != nil {
		log.Fatalf("failed to open file %v", err)
	}

	defer f.Close()

	// オブジェクト情報を照会します。
	info, _ := f.Stat()

	// オブジェクトの基本属性を表示します。
	log.Printf("size:%v, mtime:%v\n", info.Size(), info.ModTime())

	// オブジェクトのメタデータを照会します。
	if header, ok := info.Sys().(http.Header); ok {
		log.Printf("content-type:%v\n", header.Get(oss.HTTPHeaderContentType))
	}

	// オブジェクトを読み取るときのオフセットを指定します (例: 123 から開始)。
	_, err = f.Seek(123, io.SeekStart)
	if err != nil {
		log.Fatalf("failed to seek file %v", err)
	}

	// io.Copy を使用してオブジェクトのコンテンツを読み取ります。
	written, err := io.Copy(io.Discard, f)

	if err != nil {
		log.Fatalf("failed to read file %v", err)
	}

	log.Printf("read %d bytes from file", written)
}

関連情報

  • 読み取り専用クラスファイルの詳細については、「デベロッパーガイド」をご参照ください。

  • File-Like の完全なサンプルコードについては、GitHub をご参照ください。

  • File-Like の API 操作の詳細については、OpenFile をご参照ください。