Go簡單上傳
本文介紹如何通過簡單上傳方法將本地文件快速上傳到OSS,這種方式簡單直觀,適用于快速將本地文件上傳到云端存儲(chǔ)。
注意事項(xiàng)
本文以華東1(杭州)外網(wǎng)Endpoint為例。如果您希望通過與OSS同地域的其他阿里云產(chǎn)品訪問OSS,請使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對應(yīng)關(guān)系,請參見OSS訪問域名、數(shù)據(jù)中心、開放端口。
本文以從環(huán)境變量讀取訪問憑證為例。如何配置訪問憑證,請參見配置訪問憑證。
本文以OSS域名新建OSSClient為例。如果您希望通過自定義域名、STS等方式新建OSSClient,請參見初始化。
要簡單上傳,您必須有
oss:PutObject
權(quán)限。具體操作,請參見為RAM用戶授權(quán)自定義的權(quán)限策略。
示例代碼
以下代碼用于將本地文件上傳到目標(biāo)存儲(chǔ)空間examplebucket中exampledir目錄下的exampleobject.txt文件:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucketName := "examplebucket" // 請?zhí)鎿Q為實(shí)際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 依次填寫Object的完整路徑(例如exampledir/exampleobject.txt)和本地文件的完整路徑(例如D:\\localpath\\examplefile.txt)。
objectKey := "exampledir/exampleobject.txt" // 請?zhí)鎿Q為實(shí)際的對象Key
localFilePath := "D:\\localpath\\examplefile.txt" // 請?zhí)鎿Q為實(shí)際的本地文件路徑
err = bucket.PutObjectFromFile(objectKey, localFilePath)
if err != nil {
log.Fatalf("Failed to put object from file: %v", err)
}
log.Println("File uploaded successfully.")
}
常見使用場景
如何上傳字符串?
您可以使用以下代碼將字符串上傳至目標(biāo)存儲(chǔ)空間examplebucket中exampledir目錄下的exampleobject.txt文件。
package main
import (
"log"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucketName := "examplebucket" // 請?zhí)鎿Q為實(shí)際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
objectKey := "exampledir/exampleobject.txt" // 請?zhí)鎿Q為實(shí)際的對象Key
content := "Hello OSS"
err = bucket.PutObject(objectKey, strings.NewReader(content))
if err != nil {
log.Fatalf("Failed to put object: %v", err)
}
log.Println("File uploaded successfully.")
}
如何上傳Byte數(shù)組?
您可以使用以下代碼將Byte數(shù)組上傳至目標(biāo)存儲(chǔ)空間中exampledir目錄下的exampleobject.txt文件:
package main
import (
"bytes"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucketName := "examplebucket" // 請?zhí)鎿Q為實(shí)際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
err = bucket.PutObject("exampledir/exampleobject.txt", bytes.NewReader([]byte("yourObjectValueByteArrary")))
if err != nil {
log.Fatalf("Failed to put object: %v", err)
}
log.Println("File uploaded successfully.")
}
如何上傳文件流?
您可以使用以下代碼將文件流上傳至目標(biāo)存儲(chǔ)空間中exampledir目錄下的exampleobject.txt文件:
package main
import (
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucketName := "examplebucket" // 請?zhí)鎿Q為實(shí)際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。
localFilePath := "D:\\localpath\\examplefile.txt" // 請?zhí)鎿Q為實(shí)際的本地文件路徑
file, err := os.Open(localFilePath)
if err != nil {
log.Fatalf("Failed to open file: %v", err)
}
defer file.Close()
// 將文件流上傳至exampledir目錄下的exampleobject.txt文件。
objectKey := "exampledir/exampleobject.txt" // 請?zhí)鎿Q為實(shí)際的對象Key
err = bucket.PutObject(objectKey, file)
if err != nil {
log.Fatalf("Failed to put object: %v", err)
}
log.Println("File uploaded successfully.")
}
如何上傳網(wǎng)絡(luò)流?
您可以使用以下代碼將網(wǎng)絡(luò)流上傳至目標(biāo)存儲(chǔ)空間中exampledir目錄下的exampleobject.txt文件:
package main
import (
"io"
"log"
"net/http"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucketName := "examplebucket" // 請?zhí)鎿Q為實(shí)際的Bucket名稱
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket: %v", err)
}
// 填寫Object的完整路徑,例如exampledir/exampleobject.txt。
objectName := "exampledir/exampleobject.txt"
// 指定待上傳的網(wǎng)絡(luò)流。
resp, err := http.Get("https://www.aliyun.com/")
if err != nil {
log.Fatalf("Failed to fetch URL: %v", err)
}
defer resp.Body.Close()
// 將網(wǎng)絡(luò)流上傳至OSS。
err = bucket.PutObject(objectName, io.Reader(resp.Body))
if err != nil {
log.Fatalf("Failed to put object: %v", err)
}
log.Println("File uploaded successfully.")
}
如何創(chuàng)建目錄?
與傳統(tǒng)的文件系統(tǒng)不同,OSS內(nèi)部采用扁平結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。所有數(shù)據(jù)都以對象(Object)的形式保存在存儲(chǔ)空間(Bucket)中。為了方便管理,OSS控制臺將所有以正斜線(/)結(jié)尾的對象顯示為目錄,從而實(shí)現(xiàn)類似于目錄的功能。通過這種層次結(jié)構(gòu),您可以組織文件,實(shí)現(xiàn)分組并簡化權(quán)限管理。
您可以使用以下代碼創(chuàng)建目錄:
package main
import (
"bytes"
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫存儲(chǔ)空間名稱,例如examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 填寫目錄名稱,目錄需以正斜線結(jié)尾。
dirName := "exampledir/"
err = bucket.PutObject(dirName, bytes.NewReader([]byte("")))
if err != nil {
log.Fatalf("Failed to create directory '%s': %v", dirName, err)
}
log.Printf("Directory '%s' created successfully", dirName)
}
當(dāng)使用完目錄后,您可以使用以下代碼刪除目錄及目錄下的所有文件:
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider), oss.Region("yourRegion"), oss.AuthVersion(oss.AuthV4))
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// 填寫B(tài)ucket名稱。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// 填寫待刪除目錄的完整路徑,完整路徑中不包含Bucket名稱。
prefix := oss.Prefix("log/")
marker := oss.Marker("")
count := 0
for {
// 列出指定前綴下的所有對象。
lor, err := bucket.ListObjects(marker, prefix)
if err != nil {
log.Fatalf("Failed to list objects in bucket '%s' with prefix '%s': %v", bucketName, prefix, err)
}
objects := []string{}
for _, object := range lor.Objects {
objects = append(objects, object.Key)
}
if len(objects) == 0 {
break
}
// 刪除目錄及目錄下的所有文件。
// 將oss.DeleteObjectsQuiet設(shè)置為true,表示不返回刪除結(jié)果。
delRes, err := bucket.DeleteObjects(objects, oss.DeleteObjectsQuiet(true))
if err != nil {
log.Fatalf("Failed to delete objects in bucket '%s': %v", bucketName, err)
}
if len(delRes.DeletedObjects) > 0 {
log.Fatalf("Some objects failed to delete: %v", delRes.DeletedObjects)
}
count += len(objects)
// 更新分頁參數(shù)。
marker = oss.Marker(lor.NextMarker)
if !lor.IsTruncated {
break
}
}
log.Printf("Success, total delete object count: %d", count)
}
如何使用進(jìn)度條?
您可以使用進(jìn)度條查看上傳文件的進(jìn)度。下面的代碼以Bucket.PutObjectFromFile方法為例,介紹如何使用進(jìn)度條。
package main
import (
"log"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
// 定義進(jìn)度條監(jiān)聽器。
type OssProgressListener struct{}
// 定義進(jìn)度變更事件處理函數(shù)。
func (listener *OssProgressListener) ProgressChanged(event *oss.ProgressEvent) {
switch event.EventType {
case oss.TransferStartedEvent:
log.Printf("Transfer Started, ConsumedBytes: %d, TotalBytes: %d.\n", event.ConsumedBytes, event.TotalBytes)
case oss.TransferDataEvent:
log.Printf("\rTransfer Data, ConsumedBytes: %d, TotalBytes: %d, %d%%.", event.ConsumedBytes, event.TotalBytes, event.ConsumedBytes*100/event.TotalBytes)
case oss.TransferCompletedEvent:
log.Printf("\nTransfer Completed, ConsumedBytes: %d, TotalBytes: %d.\n", event.ConsumedBytes, event.TotalBytes)
case oss.TransferFailedEvent:
log.Printf("\nTransfer Failed, ConsumedBytes: %d, TotalBytes: %d.\n", event.ConsumedBytes, event.TotalBytes)
default:
log.Printf("Unknown Event Type: %d\n", event.EventType)
}
}
func main() {
// 從環(huán)境變量中獲取訪問憑證。運(yùn)行本代碼示例之前,請確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error: %v", err)
}
// 創(chuàng)建OSSClient實(shí)例。
// yourEndpoint填寫B(tài)ucket對應(yīng)的Endpoint,以華東1(杭州)為例,填寫為https://oss-cn-hangzhou.aliyuncs.com。其它Region請按實(shí)際情況填寫。
// yourRegion填寫B(tài)ucket所在地域,以華東1(杭州)為例,填寫為cn-hangzhou。其它Region請按實(shí)際情況填寫。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 設(shè)置簽名版本
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error: %v", err)
}
// 填寫存儲(chǔ)空間名稱。
bucketName := "yourBucketName"
// 填寫不包含Bucket名稱在內(nèi)的Object的完整路徑。
objectName := "yourObjectName"
// 填寫本地文件的完整路徑。
localFile := "yourLocalFile"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Error: %v", err)
}
// 帶進(jìn)度條的上傳。
err = bucket.PutObjectFromFile(objectName, localFile, oss.Progress(&OssProgressListener{}))
if err != nil {
log.Fatalf("Error: %v", err)
}
log.Println("Upload completed successfully!")
}