全部产品
Search
文档中心

Object Storage Service:Akses file baca-saja (Go SDK V2)

更新时间:Nov 09, 2025

Topik ini menjelaskan cara menggunakan operasi File-Like yang disediakan oleh Object Storage Service (OSS) SDK untuk Go 2.0 guna mengakses objek dalam sebuah bucket.

Catatan

  • Kode contoh dalam topik ini menggunakan ID Wilayah China (Hangzhou), cn-hangzhou, sebagai contoh. Titik akhir publik digunakan secara default. Jika Anda ingin mengakses OSS dari produk Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.

  • Dalam topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.

  • Untuk mengunduh file, Anda harus memiliki izin oss:GetObject. Untuk informasi lebih lanjut, lihat Berikan Izin Kustom kepada Pengguna RAM.

Metode

Operasi File-Like yang disediakan oleh OSS SDK untuk Go 2.0 memungkinkan Anda mengakses objek dalam bucket menggunakan metode ReadOnlyFile.

  • Metode ReadOnlyFile menyediakan mode aliran tunggal dan pramuat. Anda dapat menyesuaikan jumlah tugas paralel untuk meningkatkan kecepatan baca.

  • Metode ReadOnlyFile menyediakan mekanisme penyambungan ulang, yang menawarkan ketahanan kuat dalam lingkungan jaringan yang kompleks.

type ReadOnlyFile struct {
...
}

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

Parameter permintaan

Parameter

Tipe

Deskripsi

ctx

context.Context

Konteks permintaan.

bucket

string

Nama bucket.

key

string

Nama objek.

optFns

...func(*OpenOptions)

Opsional. Opsi yang dapat Anda konfigurasikan saat membuka objek.

Opsi OpenOptions

Opsi

Tipe

Deskripsi

Offset

int64

Ofset awal saat objek dibuka. Nilai default: 0.

VersionId

*string

Nomor versi objek yang ditentukan. Parameter ini hanya valid jika ada beberapa versi objek.

RequestPayer

*string

Menentukan bahwa jika pay-by-requester diaktifkan, RequestPayer harus diatur ke requester.

EnablePrefetch

bool

Menentukan apakah akan mengaktifkan mode pramuat. Secara default, mode pramuat dinonaktifkan.

PrefetchNum

int

Jumlah chunk yang dipramuat. Nilai default: 3. Parameter ini valid saat mode pramuat diaktifkan.

ChunkSize

int64

Ukuran setiap chunk yang dipramuat. Nilai default: 6 MiB. Parameter ini valid saat mode pramuat diaktifkan.

PrefetchThreshold

int64

Jumlah byte yang akan dibaca secara berurutan sebelum mode pramuat diaktifkan. Nilai default: 20 MiB. Parameter ini valid saat mode pramuat diaktifkan.

Parameter respons

Parameter

Tipe

Deskripsi

file

*ReadOnlyFile

Instansi ReadOnlyFile. Parameter ini valid saat nilai err adalah nil. Untuk informasi lebih lanjut, lihat ReadOnlyFile.

err

error

Status ReadOnlyFile. Jika terjadi kesalahan, nilai err tidak bisa nil.

Metode umum ReadOnlyFile

Metode

Deskripsi

Close() error

Menutup pegangan file untuk melepaskan sumber daya, seperti memori dan soket aktif.

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

Membaca byte dengan panjang len(p) dari sumber data, menyimpan byte tersebut di p, dan mengembalikan jumlah byte yang dibaca serta kesalahan yang ditemui.

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

Menentukan ofset untuk pembacaan atau penulisan berikutnya. Nilai valid untuk whence: 0: kepala. 1: ofset saat ini. 2: ekor.

Stat() (os.FileInfo, error)

Meminta informasi objek, termasuk ukuran objek, waktu modifikasi terakhir, dan metadata.

Penting

Catatan: Jika mode pramuat diaktifkan dan terjadi beberapa pembacaan di luar urutan, mode aliran tunggal digunakan secara otomatis.

Contoh

Baca seluruh objek menggunakan mode aliran tunggal

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"
)

// Tentukan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket kosong.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket diperlukan")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah diperlukan")
	}

	// Periksa apakah nama objek kosong.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek diperlukan")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat instans OSSClient.
	client := oss.NewClient(cfg)

	// Buka objek.
	f, err := client.OpenFile(context.TODO(), bucketName, objectName)

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

	// Baca isi objek menggunakan io.Copy.
	written, err := io.Copy(io.Discard, f)
	if err != nil {
		log.Fatalf("gagal membaca file %v", err)
	}

	log.Printf("membaca %d byte dari file", written)
}

Baca seluruh objek menggunakan mode pra-ambil

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"
)

// Tentukan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket kosong.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket diperlukan")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah diperlukan")
	}

	// Periksa apakah nama objek kosong.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek diperlukan")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat instansi OSSClient.
	client := oss.NewClient(cfg)

	// Buka objek.
	f, err := client.OpenFile(context.TODO(),
		bucketName,
		objectName,
		func(oo *oss.OpenOptions) {
			oo.EnablePrefetch = true // Aktifkan mode pramuat.
		})

	if err != nil {
		log.Fatalf("gagal membuka file %v", err)
	}

	defer f.Close()

	// Baca objek.
	written, err := io.Copy(io.Discard, f)

	if err != nil {
		log.Fatalf("gagal membaca file %v", err)
	}

	log.Printf("membaca %d byte dari file", written)
}

Baca data tersisa dari posisi tertentu menggunakan metode 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"
)

// Tentukan variabel global.
var (
	region     string // Wilayah tempat bucket berada.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Tentukan fungsi init yang digunakan untuk menginisialisasi parameter baris perintah.
func init() {
	flag.StringVar(&region, "region", "", "Wilayah tempat bucket berada.")
	flag.StringVar(&bucketName, "bucket", "", "Nama bucket.")
	flag.StringVar(&objectName, "object", "", "Nama objek.")
}

func main() {
	// Parsing parameter baris perintah.
	flag.Parse()

	// Periksa apakah nama bucket kosong.
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama bucket diperlukan")
	}

	// Periksa apakah wilayah kosong.
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, wilayah diperlukan")
	}

	// Periksa apakah nama objek kosong.
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("parameter tidak valid, nama objek diperlukan")
	}

	// Muat konfigurasi default dan tentukan penyedia kredensial dan wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat instans OSSClient.
	client := oss.NewClient(cfg)

	// Buka objek.
	f, err := client.OpenFile(context.TODO(), bucketName, objectName)

	if err != nil {
		log.Fatalf("gagal membuka file %v", err)
	}

	defer f.Close()

	// Query informasi objek.
	info, _ := f.Stat()

	// Tampilkan atribut dasar objek.
	log.Printf("ukuran:%v, waktu modifikasi:%v\n", info.Size(), info.ModTime())

	// Query metadata objek.
	if header, ok := info.Sys().(http.Header); ok {
		log.Printf("tipe konten:%v\n", header.Get(oss.HTTPHeaderContentType))
	}

	// Tentukan offset saat membaca objek, misalnya mulai dari 123.
	_, err = f.Seek(123, io.SeekStart)
	if err != nil {
		log.Fatalf("gagal mencari file %v", err)
	}

	// Baca isi objek menggunakan io.Copy.
	written, err := io.Copy(io.Discard, f)

	if err != nil {
		log.Fatalf("gagal membaca file %v", err)
	}

	log.Printf("membaca %d byte dari file", written)
}

Referensi

  • Untuk informasi lebih lanjut tentang file kelas baca-saja, lihat Panduan Pengembang.

  • Untuk kode contoh lengkap File-Like, kunjungi GitHub.

  • Untuk informasi lebih lanjut tentang operasi API File-Like, kunjungi OpenFile.