全部产品
Search
文档中心

Object Storage Service:Unggah sederhana (Go SDK V2)

更新时间:Nov 09, 2025

Topik ini menjelaskan cara cepat mengunggah file lokal ke Object Storage Service (OSS) menggunakan metode unggah sederhana. Metode ini mudah digunakan dan cocok untuk skenario yang memerlukan pengunggahan file lokal dengan cepat.

Catatan

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

  • Dalam topik ini, kredensial akses dibaca dari variabel lingkungan. Untuk informasi lebih lanjut tentang cara mengonfigurasi kredensial akses, lihat Konfigurasikan Kredensial Akses.

Izin

Secara default, Akun Alibaba Cloud memiliki izin penuh. Pengguna RAM atau Peran RAM di bawah Akun Alibaba Cloud tidak memiliki izin apa pun secara default. Akun Alibaba Cloud atau administrator akun harus memberikan izin operasi melalui RAM Policy atau Kebijakan Bucket.

API

Aksi

Definisi

PutObject

oss:PutObject

Mengunggah objek.

oss:PutObjectTagging

Saat mengunggah objek, jika Anda menentukan tag objek melalui x-oss-tagging, izin ini diperlukan.

kms:GenerateDataKey

Saat mengunggah objek, jika metadata objek berisi X-Oss-Server-Side-Encryption: KMS, kedua izin ini diperlukan.

kms:Decrypt

Definisi metode

func (c *Client) PutObject(ctx context.Context, request *PutObjectRequest, optFns ...func(*Options)) (*PutObjectResult, error)

func (c *Client) PutObjectFromFile(ctx context.Context, request *PutObjectRequest, filePath string, optFns ...func(*Options)) (*PutObjectResult, error)

Operasi API

Deskripsi

Client.PutObject

Menjalankan unggah sederhana. Ukuran maksimum objek yang dapat diunggah adalah 5 GiB.

Validasi data CRC-64 didukung dan diaktifkan secara default.

Grafik bilah kemajuan didukung.

Tipe badan permintaan adalah io.Reader. Jika tipe tersebut adalah io.Seeker, pengiriman ulang didukung jika unggah gagal.

Client.PutObjectFromFile

Operasi ini menyediakan kemampuan yang sama dengan operasi Client.PutObject.

Data badan permintaan berasal dari jalur file.

Parameter permintaan

Parameter

Tipe

Deskripsi

ctx

context.Context

Konteks permintaan. Anda dapat menggunakan parameter ini untuk menetapkan periode waktu total permintaan.

request

*PutObjectRequest

Parameter operasi API tertentu. Misalnya, Anda dapat menyetel metode kontrol akses (Acl), mencegah penimpaan (ForbidOverwrite), dan menentukan metadata kustom (Metadata). Untuk informasi lebih lanjut, lihat PutObjectRequest.

optFns

...func(*Options)

(Opsional) Parameter konfigurasi tingkat operasi. Untuk informasi lebih lanjut, lihat Options.

Nilai kembali

Nilai kembali

Tipe

Deskripsi

result

*PutObjectResult

Nilai kembali operasi API. Parameter ini valid saat err adalah nil. Untuk informasi lebih lanjut, lihat PutObjectResult.

err

error

Status permintaan. Jika permintaan gagal, err tidak nil.

Kode contoh

Anda dapat menggunakan kode berikut untuk mengunggah file lokal ke bucket tujuan.

package main

import (
	"context"
	"flag"
	"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.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Fungsi init 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 atur penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Tentukan jalur dan nama file lokal untuk diunggah, misalnya, /Users/localpath/exampleobject.txt.
	localFile := "/Users/localpath/exampleobject.txt"

	// Buat permintaan untuk mengunggah objek.
	putRequest := &oss.PutObjectRequest{
		Bucket:       oss.Ptr(bucketName),      // Nama bucket.
		Key:          oss.Ptr(objectName),      // Nama objek.
		StorageClass: oss.StorageClassStandard, // Tentukan kelas penyimpanan objek sebagai Standard.
		Acl:          oss.ObjectACLPrivate,     // Tentukan izin akses objek sebagai private.
		Metadata: map[string]string{
			"yourMetadataKey1": "yourMetadataValue1", // Setel metadata objek.
		},
	}

	// Eksekusi permintaan untuk mengunggah objek.
	result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
	if err != nil {
		log.Fatalf("gagal mengunggah objek dari file %v", err)
	}

	// Cetak hasil unggah objek.
	log.Printf("hasil unggah objek dari file:%#v\n", result)
}

Skenario umum

Unggah string

Anda dapat menggunakan kode berikut untuk mengunggah string ke bucket tujuan.

package main

import (
	"context"
	"flag"
	"log"
	"strings"

	"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.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Fungsi init 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")
	}

	// Tentukan konten string untuk diunggah.
	body := strings.NewReader("hi oss")

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

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat permintaan untuk mengunggah objek.
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName), // Nama bucket.
		Key:    oss.Ptr(objectName), // Nama objek.
		Body:   body,                // Konten string untuk diunggah.
	}

	// Kirim permintaan untuk mengunggah objek.
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal mengunggah objek %v", err)
	}

	// Cetak hasil unggah objek.
	log.Printf("hasil unggah objek:%#v\n", result)
}

Unggah larik byte

Anda dapat menggunakan kode berikut untuk mengunggah larik byte ke bucket tujuan.

package main

import (
	"bytes"
	"context"
	"flag"
	"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.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Fungsi init 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")
	}

	// Tentukan konten larik byte untuk diunggah.
	body := bytes.NewReader([]byte("yourObjectValueByteArray"))

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

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Buat permintaan untuk mengunggah objek.
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName), // Nama bucket.
		Key:    oss.Ptr(objectName), // Nama objek.
		Body:   body,                // Konten larik byte untuk diunggah.
	}

	// Kirim permintaan untuk mengunggah objek.
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal mengunggah objek %v", err)
	}

	// Cetak hasil unggah objek.
	log.Printf("hasil unggah objek:%#v\n", result)
}

Unggah aliran jaringan

Anda dapat menggunakan kode berikut untuk mengunggah aliran jaringan ke bucket tujuan.

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.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Fungsi init 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 atur penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Tentukan aliran jaringan untuk diunggah.
	resp, err := http.Get("https://www.aliyun.com/")
	if err != nil {
		log.Fatalf("Gagal mengambil URL: %v", err)
	}
	defer resp.Body.Close()

	// Buat permintaan untuk mengunggah objek.
	request := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName),  // Nama bucket.
		Key:    oss.Ptr(objectName),  // Nama objek.
		Body:   io.Reader(resp.Body), // Konten aliran jaringan untuk diunggah.
	}

	// Kirim permintaan untuk mengunggah objek.
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal mengunggah objek %v", err)
	}

	// Cetak hasil unggah objek.
	log.Printf("hasil unggah objek:%#v\n", result)
}

Tampilkan kemajuan selama unggah

Saat mengunggah file, Anda dapat menggunakan grafik bilah kemajuan untuk melihat kemajuan unggah secara real-time. Ini membantu Anda memantau unggahan dan memastikan bahwa tugas tidak macet selama waktu tunggu yang lama.

Anda dapat menggunakan kode berikut untuk melihat kemajuan unggah file menggunakan grafik bilah kemajuan.

package main

import (
	"context"
	"flag"
	"fmt"
	"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.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Fungsi init 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 atur penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Tentukan jalur dan nama file lokal untuk diunggah, misalnya, /Users/localpath/exampleobject.txt.
	localFile := "/Users/localpath/exampleobject.txt"

	// Buat permintaan untuk mengunggah objek.
	putRequest := &oss.PutObjectRequest{
		Bucket: oss.Ptr(bucketName), // Nama bucket.
		Key:    oss.Ptr(objectName), // Nama objek.
		ProgressFn: func(increment, transferred, total int64) {
			fmt.Printf("increment:%v, transferred:%v, total:%v\n", increment, transferred, total)
		}, // Fungsi panggilan balik kemajuan, yang digunakan untuk menampilkan kemajuan unggah.
	}

	// Kirim permintaan untuk mengunggah objek.
	result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
	if err != nil {
		log.Fatalf("gagal mengunggah objek dari file %v", err)
	}

	// Cetak hasil unggah objek.
	log.Printf("hasil unggah objek dari file:%#v\n", result)
}

Setel fungsi panggilan balik saat Anda mengunggah file

OSS dapat memberikan panggilan balik ke server aplikasi saat unggah sederhana (PutObject dan PutObjectFromFile) selesai. Anda hanya perlu menyertakan parameter panggilan balik yang sesuai dalam permintaan yang dikirim ke OSS untuk mengimplementasikan panggilan balik.

Anda dapat menggunakan kode berikut untuk menyetel fungsi panggilan balik saat mengunggah file.

package main

import (
	"context"
	"encoding/base64"
	"encoding/json"
	"flag"
	"log"
	"strings"

	"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.
	bucketName string // Nama bucket.
	objectName string // Nama objek.
)

// Fungsi init 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 atur penyedia kredensial serta wilayah.
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// Buat klien OSS.
	client := oss.NewClient(cfg)

	// Tentukan parameter panggilan balik.
	callbackMap := map[string]string{
		"callbackUrl":      "http://example.com:23450",                                                        // Setel URL server panggilan balik, misalnya, https://example.com:23450.
		"callbackBody":     "bucket=${bucket}&object=${object}&size=${size}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}", // Setel badan permintaan panggilan balik.
		"callbackBodyType": "application/x-www-form-urlencoded",                                                          // Setel tipe badan permintaan panggilan balik.
	}

	// Konversi parameter panggilan balik ke JSON dan lakukan pengkodean Base64 untuk melewatinya sebagai parameter panggilan balik.
	callbackStr, err := json.Marshal(callbackMap)
	if err != nil {
		log.Fatalf("gagal membuat marshal callback map: %v", err)
	}
	callbackBase64 := base64.StdEncoding.EncodeToString(callbackStr)

	callbackVarMap := map[string]string{}
	callbackVarMap["x:my_var1"] = "thi is var 1"
	callbackVarMap["x:my_var2"] = "thi is var 2"
	callbackVarStr, err := json.Marshal(callbackVarMap)
	if err != nil {
		log.Fatalf("gagal membuat marshal callback var: %v", err)
	}
	callbackVarBase64 := base64.StdEncoding.EncodeToString(callbackVarStr)
	// Tentukan konten string untuk diunggah.
	body := strings.NewReader("Hello, OSS!") // Ganti ini dengan konten string untuk diunggah.

	// Buat permintaan untuk mengunggah objek.
	request := &oss.PutObjectRequest{
		Bucket:      oss.Ptr(bucketName),     // Nama bucket.
		Key:         oss.Ptr(objectName),     // Nama objek.
		Body:        body,                    // Konten objek.
		Callback:    oss.Ptr(callbackBase64), // Parameter panggilan balik.
		CallbackVar: oss.Ptr(callbackVarBase64),
	}

	// Kirim permintaan untuk mengunggah objek.
	result, err := client.PutObject(context.TODO(), request)
	if err != nil {
		log.Fatalf("gagal mengunggah objek %v", err)
	}

	// Cetak hasil unggah objek.
	log.Printf("hasil unggah objek:%#v\n", result)
}

Referensi