All Products
Search
Document Center

Object Storage Service:Unduhan rentang (Go SDK V1)

Last Updated:Nov 29, 2025

Topik ini menjelaskan cara melakukan unduhan rentang, yang memungkinkan Anda mengambil bagian spesifik dari suatu file secara efisien.

Catatan penggunaan

  • Pada topik ini, digunakan titik akhir publik wilayah China (Hangzhou). Jika Anda mengakses OSS dari layanan Alibaba Cloud lainnya 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 mengenai 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 melakukan unduhan rentang, Anda harus memiliki izin oss:GetObject. Untuk informasi selengkapnya, lihat Berikan izin kustom kepada RAM user.

Kode contoh

Kode berikut menunjukkan cara mengunduh data dari rentang tertentu dalam suatu file.

package main

import (
	"io"
	"log"
	"strings"

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

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

	// Buat instans OSSClient.
	// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan Endpoint yang sesuai.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sesuai.
	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 := "yourBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Unggah konten sebesar 1.000 byte.
	strContent := ""
	for i := 0; i < 100; i++ {
		strContent += "abcdefghij"
	}
	log.Printf("content len: %d\n", len(strContent))

	// Unggah string tersebut.
	objectName := "yourObjectName"
	err = bucket.PutObject(objectName, strings.NewReader(strContent))
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Ambil data dalam rentang byte 15 hingga 35. Ini mencakup byte 15 dan 35, total 21 byte.
	// Jika rentang yang ditentukan tidak valid (misalnya, posisi awal atau akhir bernilai negatif atau melebihi ukuran file), seluruh file akan diunduh.
	body, err := bucket.GetObject(objectName, oss.Range(15, 35))
	if err != nil {
		log.Fatalf("Error: %v", err)
	}
	defer body.Close()

	// Baca data ke dalam memori.
	data, err := io.ReadAll(body)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}
	log.Printf("data: %s", string(data))
}

FAQ

Apa yang terjadi jika saya menentukan rentang unduhan yang tidak valid?

Misalnya, Anda memiliki objek berukuran 1.000 byte. Rentang unduhan yang valid adalah dari byte 0 hingga byte 999. Jika Anda menentukan rentang di luar interval tersebut, parameter Range tidak berpengaruh. Tanggapan akan mengembalikan kode status 200 dan menyertakan seluruh objek. Contoh berikut menunjukkan permintaan tidak valid beserta tanggapannya:

  • Jika Anda menentukan Range: bytes=500~2000, akhir rentang berada di luar interval yang valid. Seluruh file dikembalikan dengan kode status HTTP 200.

  • Jika Anda menentukan Range: bytes=1000~2000, awal rentang berada di luar interval yang valid. Seluruh file dikembalikan dengan kode status HTTP 200.

Apa itu unduhan rentang dengan perilaku standar?

Unduhan rentang dengan perilaku standar menambahkan header permintaan x-oss-range-behavior:standard untuk mengubah perilaku unduhan OSS ketika rentang yang ditentukan tidak valid. Misalnya, Anda memiliki objek berukuran 1.000 byte:

  • Jika Anda menentukan Range: bytes=500~2000, akhir rentang berada di luar interval yang valid. Konten dari byte 500 hingga byte 999 dikembalikan dengan kode status HTTP 206.

  • Jika Anda menentukan Range: bytes=1000~2000, awal rentang berada di luar interval yang valid. Kode status HTTP 416 dikembalikan bersama kode kesalahan InvalidRange.

Kode berikut menunjukkan cara melakukan unduhan rentang dengan perilaku standar.

package main

import (
	"io"
	"log"
	"strings"

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

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

	// Buat instans OSSClient.
	// Setel yourEndpoint ke Endpoint bucket. Misalnya, untuk bucket di wilayah China (Hangzhou), setel Endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Untuk wilayah lain, gunakan Endpoint yang sesuai.
	// Setel yourRegion ke wilayah tempat bucket berada. Misalnya, untuk bucket di wilayah China (Hangzhou), setel wilayah ke cn-hangzhou. Untuk wilayah lain, gunakan wilayah yang sesuai.
	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 := "yourBucketName"
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Unggah konten sebesar 1.000 byte.
	strContent := ""
	for i := 0; i < 100; i++ {
		strContent += "abcdefghij"
	}
	log.Printf("content len: %d\n", len(strContent))

	// Unggah string tersebut.
	objectName := "yourObjectName"
	err = bucket.PutObject(objectName, strings.NewReader(strContent))
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	// Jika Anda menentukan Range: bytes=500~2000, akhir rentang berada di luar interval yang valid. Konten dari byte 500 hingga byte 999 dikembalikan, dan kode status HTTP-nya adalah 206.
	// Jika Anda menentukan Range: bytes=1000~2000, awal rentang berada di luar interval yang valid. Kode status HTTP 416 dikembalikan bersama kode kesalahan InvalidRange.
	rangeStart := int64(1000)
	rangeEnd := int64(2000)
	body, err := bucket.GetObject(objectName, oss.Range(rangeStart, rangeEnd), oss.RangeBehavior("standard"))
	if err != nil {
		log.Fatalf("Error: %v", err)
	}
	defer body.Close()

	// Baca data ke dalam memori.
	data, err := io.ReadAll(body)
	if err != nil {
		log.Fatalf("Error: %v", err)
	}

	if len(data) != 500 {
		log.Fatalf("read data error, len: %d", len(data))
	}
	log.Printf("data: %s", string(data))
}

Referensi

  • Untuk kode contoh lengkap mengenai unduhan rentang, lihat Contoh GitHub.

  • Untuk informasi selengkapnya mengenai operasi API untuk unduhan rentang, lihat GetObject.