All Products
Search
Document Center

Object Storage Service:Unduh objek ke file lokal (Go SDK V1)

Last Updated:Nov 29, 2025

Topik ini menjelaskan cara mengunduh objek dari bucket ke file lokal.

Catatan

  • Pada topik ini, digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lain yang berada di wilayah yang sama dengan OSS, gunakan titik akhir internal. Untuk informasi selengkapnya mengenai wilayah dan titik akhir OSS, lihat Wilayah dan titik akhir.

  • Pada topik ini, kredensial akses diperoleh dari variabel lingkungan. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial akses, lihat Konfigurasi kredensial akses.

  • Pada topik ini, instans OSSClient dibuat menggunakan titik akhir OSS. Jika Anda ingin membuat instans OSSClient menggunakan nama domain kustom atau Security Token Service (STS), lihat Konfigurasi client (Go SDK V1).

  • Untuk mengunduh objek ke file lokal, Anda harus memiliki izin oss:GetObject. Untuk informasi selengkapnya, lihat Berikan kebijakan akses kustom kepada RAM user.

Kode contoh

Kode berikut menunjukkan cara mengunduh file exampleobject.txt dari folder exampledir di bucket examplebucket ke path lokal D:\localpath\examplefile.txt.

package main

import (
	"log"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke titik akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk bucket di wilayah lain, setel titik akhir ke titik akhir aktual.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk bucket di wilayah lain, setel wilayah ke wilayah aktual.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat client OSS: %v", err)
	}

	// Tentukan nama bucket, misalnya examplebucket.
	bucketName := "examplebucket" // Ganti dengan nama bucket yang sebenarnya.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket: %v", err)
	}

	// Unduh objek ke file lokal dan simpan ke path lokal yang ditentukan. Jika file lokal yang ditentukan sudah ada, file tersebut akan ditimpa. Jika file lokal yang ditentukan belum ada, file tersebut akan dibuat.
	// Jika Anda tidak menentukan path lokal, file yang diunduh akan disimpan ke path lokal proyek tempat program contoh berada.
	// Tentukan path lengkap objek, misalnya exampledir/exampleobject.txt, dan path lengkap file lokal, misalnya D:\\localpath\\examplefile.txt. Path lengkap objek tidak boleh mengandung nama bucket.
	objectName := "exampledir/exampleobject.txt"
	localFilePath := "D:\\localpath\\examplefile.txt"
	err = bucket.GetObjectToFile(objectName, localFilePath)
	if err != nil {
		log.Fatalf("Gagal mengunduh file: %v", err)
	}

	log.Println("File berhasil diunduh.")
}

Skenario

Unduhan bersyarat

Anda dapat menentukan kondisi saat mengunduh objek dari bucket. Kondisi tersebut dapat didasarkan pada waktu modifikasi terakhir objek atau ETag-nya. ETag adalah pengidentifikasi untuk konten objek. Objek hanya akan diunduh jika kondisi yang ditentukan terpenuhi; jika tidak, error akan dikembalikan. Unduhan bersyarat membantu mengurangi lalu lintas jaringan dan meningkatkan efisiensi.

OSS mendukung kondisi berikut:

Catatan
  • If-Modified-Since dan If-Unmodified-Since dapat digunakan bersamaan. If-Match dan If-None-Match juga dapat digunakan bersamaan.

  • Untuk mengambil ETag, gunakan metode ossClient.getObjectMeta.

Parameter

Deskripsi

Cara menyetel

IfModifiedSince

Jika waktu yang ditentukan lebih awal daripada waktu modifikasi aktual objek, objek akan diunduh. Jika tidak, error 304 Not Modified dikembalikan.

oss.IfModifiedSince

IfUnmodifiedSince

Jika waktu yang ditentukan sama dengan atau lebih baru daripada waktu modifikasi aktual objek, objek akan diunduh. Jika tidak, error 412 Precondition Failed dikembalikan.

oss.IfUnmodifiedSince

IfMatch

Jika ETag yang ditentukan sesuai dengan ETag objek di OSS, objek akan diunduh. Jika tidak, error 412 Precondition Failed dikembalikan.

oss.IfMatch

IfNoneMatch

Jika ETag yang ditentukan tidak sesuai dengan ETag objek di OSS, objek akan diunduh. Jika tidak, error 304 Not Modified dikembalikan.

oss.IfNoneMatch

Kode berikut menunjukkan cara melakukan unduhan bersyarat.

package main

import (
	"log"
	"time"

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

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Gagal membuat penyedia kredensial: %v", err)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke titik akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk bucket di wilayah lain, setel titik akhir ke titik akhir aktual.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk bucket di wilayah lain, setel wilayah ke wilayah aktual.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Gagal membuat client OSS: %v", err)
	}

	// Tentukan nama bucket.
	bucketName := "yourBucketName" // Ganti dengan nama bucket yang sebenarnya.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Gagal mendapatkan bucket: %v", err)
	}

	// Asumsikan objek terakhir dimodifikasi pada pukul 18:43:02, 21 November 2023. Jika Anda menentukan waktu UTC yang lebih awal dari waktu ini, kondisi IfModifiedSince terpenuhi dan unduhan dipicu.
	date := time.Date(2023, time.November, 21, 18, 43, 2, 0, time.UTC)

	// Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket.
	objectName := "yourObjectName" // Ganti dengan nama objek yang sebenarnya.
	localFilePath := "LocalFile"   // Path file lokal.

	// Kondisi tidak terpenuhi. Objek tidak diunduh.
	err = bucket.GetObjectToFile(objectName, localFilePath, oss.IfUnmodifiedSince(date))
	if err == nil {
		log.Fatal("Mengharapkan error ketika kondisi tidak terpenuhi, tetapi mendapatkan nil")
	}

	// Kondisi terpenuhi. Objek diunduh.
	err = bucket.GetObjectToFile(objectName, localFilePath, oss.IfModifiedSince(date))
	if err != nil {
		log.Fatalf("Gagal mengunduh file: %v", err)
	}

	log.Println("File berhasil diunduh.")
}

Tampilkan progress bar untuk unduhan

Saat mengunduh objek, Anda dapat menggunakan progress bar untuk memantau progres unduhan secara real-time. Fitur ini membantu Anda melacak status tugas dan menghindari kekhawatiran bahwa unduhan macet selama waktu tunggu yang lama.

Kode berikut menunjukkan cara menampilkan progress bar saat mengunduh objek exampleobject.txt dari bucket examplebucket.

package main

import (
	"log"
	"sync/atomic"

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

// Definisikan pendengar progres.
type OssProgressListener struct {
	lastProgress int64
}

// Definisikan penanganan untuk event perubahan progres.
func (listener *OssProgressListener) ProgressChanged(event *oss.ProgressEvent) {
	switch event.EventType {
	case oss.TransferStartedEvent:
		log.Printf("Transfer Dimulai, 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 Selesai, ConsumedBytes: %d, TotalBytes %d.\n",
			event.ConsumedBytes, event.TotalBytes)
	case oss.TransferFailedEvent:
		log.Printf("\nTransfer Gagal, ConsumedBytes: %d, TotalBytes %d.\n",
			event.ConsumedBytes, event.TotalBytes)
	default:
	}
}

func main() {
	// Peroleh kredensial akses dari variabel lingkungan. Sebelum menjalankan kode contoh, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Buat instans OSSClient.
	// Setel yourEndpoint ke titik akhir bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel titik akhir ke https://oss-cn-hangzhou.aliyuncs.com. Untuk bucket di wilayah lain, setel titik akhir ke titik akhir aktual.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk bucket di wilayah lain, setel wilayah ke wilayah aktual.
	clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
	clientOptions = append(clientOptions, oss.Region("yourRegion"))
	// Setel versi signature.
	clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
	client, err := oss.New("yourEndpoint", "", "", clientOptions...)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Tentukan nama bucket.
	bucketName := "examplebucket"
	// Tentukan path lengkap objek. Path lengkap tidak boleh mengandung nama bucket.
	objectName := "exampleobject.txt"
	// Tentukan path lengkap file lokal. Jika file lokal yang ditentukan sudah ada, file tersebut akan ditimpa. Jika file lokal yang ditentukan belum ada, file tersebut akan dibuat.
	// Jika Anda tidak menentukan path lokal, file yang diunduh akan disimpan ke path lokal proyek tempat program contoh berada.
	localFile := "D:\\localpath\\examplefile.txt"

	// Dapatkan bucket.
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Unduh objek dengan progress bar.
	err = bucket.GetObjectToFile(objectName, localFile, oss.Progress(&OssProgressListener{}))
	if err != nil {
		log.Fatalf("Error: %v", err)
	}
	log.Println("Transfer Selesai.")
}

Referensi

  • Untuk kode contoh lengkap yang menunjukkan cara mengunduh objek ke file lokal, lihat GitHub.

  • Untuk informasi selengkapnya tentang operasi API yang digunakan untuk mengunduh objek ke file lokal, lihat GetObjectToFile.