對象存儲 GOLANG SDK
安裝
SDK
Git hub地址: https://github.com/NetEase-Object-Storage/nos-golang-sdk
曆史版本: 無
環境要求
建議golang 1.3+ 使用以下命令顯示當前的golang版本:
go version
安裝
命令行方式
在命令行下執行:
go get -u github.com/NetEase-Object-Storage/nos-golang-sdk
sdk會安裝到GOPATH目錄下
源碼安裝
從git hub地址上手動下載sdk,存到GOPATH目錄下。使用以下命令顯示當前的GOPATH路徑:
go env
初始化
確定EndPoint
EndPoint 是NOS各個區域的地址,目前支持以下形式
| EndPoint類型 | 備注 |
|---|---|
| NOS區域域名地址 | 使用桶所在的區域的NOS域名地址 |
NOS區域域名地址
進入NOS控製台,在桶的 屬性 中可以查找到當前桶所在的區域及域名,桶的域名的後綴部分為 該桶的公網域名,例如:test-logging.nos-eastchina1.126.net中的nos-eastchina1.126.net 為該桶的公網EndPoint。
配置秘鑰
要接入NOS服務,您需要一對有效的AccessKey(包括AccessKeyId與AccessKeySecret)來進行 簽名驗證,開通服務與AccessKey請參考 訪問控製 :
在獲取到AccessKeyId與AccessKeySecret之後,可以按照以下的步驟進行初始化
新建NosClient
GO-SDK提供的接口都在NosClient中實現,並以成員方法的方式對外提供調用。因此使用GO-SDK前必須實例化一個NosClient對象。
關於請求參數
NosClient中的方法采用對象方式進行傳參:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
copyObjectRequest := &CopyObjectRequest{
SrcBucket : TEST_BUCKET,
SrcObject : PUTOBJECTFILE,
DestBucket : TEST_BUCKET,
DestObject : "CopiedTest",
}
err := nosClient.CopyObject(copyObjectRequest)
}
實例化NosClient
如果您需要修改NosClient的默認參數,可以在實例化NosClient時傳入Config實例。Config是NosClient的配置類,可配置連接超時、Key等參數。通過Config可以設置的參數見下表:
| 參數 | 描述 | 是否必須 |
|---|---|---|
| Endpoint | 上傳的NOS地址 | 是 |
| AccessKey | 認證使用的Access Key | 否 |
| SecretKey | 認證使用的Access Secret | 否 |
| NosServiceConnectTimeout | 建立連接的超時時間(單位:秒)默認:30秒 | 否 |
| NosServiceReadWriteTimeout | Socket層傳輸數據超時時間(單位:秒)默認:60秒 | 否 |
| NosServiceMaxIdleConnection | 最大空閑連接時間(單位:秒)默認:60秒 | 否 |
| LogLevel | 打印日誌的等級默認:Debug | 否 |
| Logger | 打印日誌的對象 | 否 |
帶Config參數實例化NosClient的示例代碼:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
"github.com/NetEase-Object-Storage/nos-golang-sdk/logger"
)
func main() {
conf := &config.Config{
Endpoint: "nos.netease.com",
AccessKey: "your-accesskey",
SecretKey: "your-secretkey",
NosServiceConnectTimeout: 3,
NosServiceReadWriteTimeout: 15,
NosServiceMaxIdleConnection: 500,
LogLevel: logger.LogLevel(logger.DEBUG),
Logger: logger.NewDefaultLogger(),
}
nosClient, err := nosclient.New(conf)
if err != nil {
fmt.Println(err.ERROR())
return
}
}
Attention:
1. 後麵的示例代碼默認您已經實例化了所需的NosClient對象, 不再贅述,後續的代碼示例均需要將實例化的代碼寫入main函數
快速入門
快速入門
請確認您已經熟悉NOS的基本概念,如Bucket、Object、EndPoint、AccessKeyId和AccessKeySecret等。 本節您將看到如何快速的使用NOS GOLANG SDK,完成常用的操作,上傳文件、下載文件等
常用包
| 常用類型 | 備注 |
|---|---|
| nosclient | 包含了主要的對象操作API |
| model | 包含了對象操作API的請求和響應的結構類型 |
基本操作
上傳文件
對象(Object)是NOS中最基本的數據單元,您可以把它簡單的理解為文件,以下代碼可以實現簡單的對象上傳:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
metadata := &model.ObjectMetadata{
Metadata: map[string]string{
nosconst.CONTENT_TYPE: contentType,
nosconst.CONTENT_MD5: OBJECTMD5,
},
}
putObjectRequest := &model.PutObjectRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
FilePath: path,
Metadata: metadata,
}
result, err := nosClient.PutObjectByFile(putObjectRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
} else {
fmt.Println(result) // Pretty-print the response data.
}
}
Attention:
1. 對象命名規則請參見 API 手冊 對象
更多的上傳文件信息,請參見 NOS-GOLANG-SDK 上傳文件
下載文件
上傳對象成功之後,您可以讀取它的內容,以下代碼可以實現文件的下載:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
objectRequest := &model.GetObjectRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
}
objectResult, err := nosClient.GetObject(objectRequest)
if err != nil {
fmt.Println(err.Error())
}
}
更多的下載文件信息,請參見 NOS-GOLANG-SDK 下載文件
列舉文件
當上傳文件成功之後,可以查看桶中包含的文件列表,以下代碼展示如何列舉桶內的文件:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
listRequest := &model.ListObjectsRequest{
Bucket: "使用的桶名,注意命名規則",
Prefix: PREFIX,
Delimiter: DELIMITER,
Marker: MARKER,
MaxKeys: 100,
}
objectResult, err := s.nosClient.ListObjects(listRequest)
if err != nil {
fmt.Println(err.Error())
}
}
Note:
1. 上麵的代碼默認列舉100個object
更多的管理文件信息,請參見 NOS-GOLANG-SDK 文件管理
刪除文件
文件上傳成功後,可以指定刪除桶中的文件,以下代碼實現桶中文件的刪除:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
objectRequest := &model.ObjectRequest{
Bucket : "使用的桶名,注意命名規則",
Object : "使用的對象名,注意命名規則",
}
err := nosClient.DeleteObject(objectRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
return
}
}
文件上傳
在NOS中用戶的基本操作單元是對象,亦可以理解為文件,NOS PHP SDK提供了豐富的上傳接口,可以通過以下的方式上傳文件:
1. 流式上傳 2. 本地文件上傳 3. 大對象上傳
字符串上傳、本地文件上傳最大為100M,大對象上傳對文件大小沒有限製
流式上傳
通過PutObjectByStream方法上傳對象,該方法隻支持小於100M的對象。示例代碼如下:
package main
import (
"fmt"
"os"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosconst"
)
func main() {
file, err := os.Open(Path)
metadata := &model.ObjectMetadata{
ContentLength: contentLength,
Metadata: map[string]string{
nosconst.CONTENT_TYPE: CONTENTTYPE,
nosconst.CONTENT_MD5: OBJECTMD5,
},
}
putObjectRequest := &model.PutObjectRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
Body: file,
Metadata: metadata,
}
result, err := nosClient.PutObjectByStream(putObjectRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
} else {
fmt.Println(result) // Pretty-print the response data.
}
}
Attention:
1. 上傳的字符串內容不超過100M
本地文件上傳
通過PutObjectByFile方法上傳本地文件,該方法隻支持小於100M的文件。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
metadata := &model.ObjectMetadata{
Metadata: map[string]string{
nosconst.CONTENT_TYPE: contentType,
nosconst.CONTENT_MD5: OBJECTMD5,
},
}
putObjectRequest := &model.PutObjectRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
FilePath: path,
Metadata: metadata,
}
result, err := nosClient.PutObjectByFile(putObjectRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
} else {
fmt.Println(result) // Pretty-print the response data.
}
}
Attention:
1. 上傳的文件內容不超過100M
分片上傳
除了通過putObject接口上傳文件到NOS之外,NOS還提供了另外一種上傳模式-分片上傳,用戶可以在如下應用場景內(但不限於此),使用分片上傳模式,如:
1. 需支持斷點上傳 2. 上傳超過100M的文件 3. 網絡條件較差,經常和NOS服務器斷開連接 4. 上傳前無法確定文件大小
初始化分塊
通過InitMultiUpload方法實現分塊上傳的初始化。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
initRequest := &model.InitMultiUploadRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
}
initResult, err := nosClient.InitMultiUpload(initRequest)
if err != nil {
fmt.Println(err.Error())
}
uploadId := initResult.UploadId //同一個對象的分塊上傳都要攜帶該uploadId
}
分塊上傳
通過UploadPart方法實現分塊上傳。示例代碼如下:
package main
import (
"os"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
file, err := os.Open(path)
uploadPartRequest := &model.UploadPartRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
UploadId: uploadId,
PartNumber: partNumber, //number of uploading
Content: content, //content of uploading
PartSize: partSize, //size of uploading the part
ContentMd5: OBJECTMD5, //md5 of uploading the part
}
buffer := make([]byte, BufferSize)
var partNum int
for ; ; {
partNum++
readLen, err := file.Read(buffer)
if err != nil || n == 0 {
break
}
uploadPartRequest.PartSize = int64(readLen)
uploadPartRequest.PartNumber = partNum
uploadPartRequest.Content = buffer
uploadPart, err := nosClient.UploadPart(uploadPartRequest)
if err != nil {
break
}
}
}
分塊終止上傳
通過AbortMultiUpload方法終止分塊上傳。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
abortMultiUploadRequest := &model.AbortMultiUploadRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
UploadId: uploadId,
}
err := nosClient.AbortMultiUpload(abortMultiUploadRequest)
if err != nil {
fmt.Println(err.Error())
}
}
完成分塊上傳
通過CompleteMultiUpload方法完成分塊上傳。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
completeMultiUploadRequest := &model.CompleteMultiUploadRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
UploadId: uploadId,
Parts: etags, //map,partnum: etag
ContentMd5: contentMd5, //body md5
ObjectMd5: objectMd5, //big file md5
}
completeResult, err := nosClient.CompleteMultiUpload(completeMultiUploadRequest)
if err != nil {
fmt.Println(err.Error())
}
}
列出分塊
查看已經上傳的分片可以羅列出指定Upload ID(InitiateMultipartUpload時獲取)所屬的所有已經上傳成功的分片,您可以通過NosClient::listParts接口獲取已經上傳的分片,可以參考以下代碼:
通過ListUploadParts方法實現列出一個UploadId對應的所有分塊。可以設置的參數為:
| 參數 | 作用 |
|---|---|
| UploadId | 分塊上傳的UploadId |
| MaxParts | 響應中的limit個數, 取值範圍[0-1000],默認1000 |
| PartNumberMarker | 分塊號的界限,隻有更大的分塊號會被列出來 |
示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
listUploadPartsRequest := &model.ListUploadPartsRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
UploadId: uploadId,
MaxParts: 2,
PartNumberMarker: 20,
}
completeResult, err := nosClient.ListUploadParts(completeMultiUploadRequest)
if err != nil {
fmt.Println(err.Error())
}
}
列出所有上傳的分塊
通過ListMultiUploads方法羅列出所有執行中的Multipart Upload事件,即已經被初始化的Multipart Upload但是未被Complete或者Abort的Multipart Upload事件。可以設置的參數為:
| 參數 | 作用 |
|---|---|
| KeyMarker | 指定某一uploads key,隻有大於該key-marker的才會被列出 |
| MaxUploads | 最多返回max-uploads條記錄,取值範圍[0-1000],默認1000 |
示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
listMultiUploadsRequest = &model.ListMultiUploadsRequest{
Bucket: "使用的桶名,注意命名規則",
KeyMarker: KEYMARKER,
MaxUploads: 20,
}
completeResult, err := nosClient.ListMultiUploads(listMultiUploadsRequest)
if err != nil {
fmt.Println(err.Error())
}
}
文件下載
下載文件
通過GetObject方法獲取對象的網絡流。可以設置的參數列表為:
| 參數 | 作用 |
|---|---|
| ObjRange | 下載指定對象的指定範圍的數據 |
| IfModifiedSince | 文件的最後修改時間小於等於If-Modified-Since參數指定的時間,則不進行下載,否則正常下載文件 |
示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
objectRequest := &model.GetObjectRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
}
objectResult, err := nosClient.GetObject(objectRequest)
if err != nil {
fmt.Println(err.Error())
}
}
文件管理
在NOS中,用戶可以通過一係列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。
列出桶中的文件
通過ListObjects方法獲取用戶桶下麵的對象。可以設置的參數列表如下:
| 參數 | 作用 |
|---|---|
| Prefix | 限定返回的object key必須以prefix作為前綴 |
| Delimiter | 是一個用於對Object名字進行分組的字符。所有名字包含指定的前綴且第一次出現delimiter字符之間的object作為一組元素——CommonPrefixes |
| Marker | 字典序的起始標記,隻列出該標記之後的部分 |
| MaxKeys | 限定返回的數量,返回的結果小於或等於該值(默認值為100) |
示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
listRequest := &model.ListObjectsRequest{
Bucket: "使用的桶名,注意命名規則",
Prefix: PREFIX,
Delimiter: DELIMITER,
Marker: MARKER,
MaxKeys: 100,
}
objectResult, err := nosClient.ListObjects(listRequest)
if err != nil {
fmt.Println(err.Error())
}
}
判斷文件是否存在
通過DoesObjectExist方法來判斷對象是否存在。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
objectRequest := &model.ObjectRequest{
Bucket : "使用的桶名,注意命名規則",
Object : "使用的對象名,注意命名規則",
}
isExist, err := nosClient.DoesObjectExist(objectRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
}
}
刪除單個文件
通過DeleteObject方法實現單個文件刪除功能。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
objectRequest := &model.ObjectRequest{
Bucket : "使用的桶名,注意命名規則",
Object : "使用的對象名,注意命名規則",
}
err := nosClient.DeleteObject(objectRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
return
}
}
刪除多個文件
通過DeleteMultiObjects方法實現多個文件刪除功能。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
deleteMultiObjects := DeleteMultiObjects{
Quiet: false, //詳細和靜默模式,設置為true的時候,隻返回刪除錯誤的文件列表,設置為false的時候,成功和失敗的文件列表都返回
}
deleteMultiObjects.Append(DeleteObject{Key:PUTOBJECTFILE})
deleteMultiObjects.Append(DeleteObject{Key:PUTOBJECTFILE+"1"})
deleteMultiObjects.Append(DeleteObject{Key:PUTOBJECTFILE+"2"})
deleteMultiObjects.Append(DeleteObject{Key:PUTOBJECTFILE+"3"})
deleteRequest := &DeleteMultiObjectsRequest{
Bucket : "使用的桶名,注意命名規則",
DelectObjects : &deleteMultiObjects,
}
deleteResult, err := nosClient.DeleteMultiObjects(deleteRequest)
if err != nil {
fmt.Println(err.Error())
}
}
拷貝文件
通過CopyObject方法實現對象複製功能,NOS支持桶內copy以及相同用戶的跨桶copy。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
copyRequest := &model.CopyObjectRequest{
SrcBucket : SRC_BUCKET,
SrcObject : SRC_OBJECT,
DestBucket : DEST_BUCKET,
DestObject : DEST_OBJECT,
}
err := nosClient.CopyObject(copyRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error
}
}
Attention:
1 .支持跨桶的文件copy
移動文件
通過MoveObject方法實現對象重命名,NOS隻支持桶內重命名。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
moveRequest := &model.MoveObjectRequest{
SrcBucket : SRC_BUCKET,
SrcObject : SRC_OBJECT,
DestBucket : DEST_BUCKET,
DestObject : DEST_OBJECT,
}
err := nosClient.MoveObject(moveRequest)
if err != nil {
fmt.Println(err.Error()) // Message from an error.
}
}
Attention:
1.暫時不支持跨桶的文件move
獲取文件的文件元信息
通過GetObjectMetaData方法獲取文件的元數據。示例代碼如下:
package main
import (
"fmt"
"github.com/NetEase-Object-Storage/nos-golang-sdk/nosclient"
"github.com/NetEase-Object-Storage/nos-golang-sdk/model"
)
func main() {
objectRequest := &model.GetObjectRequest{
Bucket: "使用的桶名,注意命名規則",
Object: "使用的對象名,注意命名規則",
}
metaData, err := nosClient.GetObjectMetaData(objectRequest)
if err != nil {
fmt.Println(err.Error())
}
}
錯誤處理
返回的錯誤類型一共有兩種,分別是客戶端錯誤和服務端錯誤,分別都實現了error方法。
type ClientError struct {
StatusCode int
Resource string
Message string
}
type ServerError struct {
StatusCode int
RequestId string
NosErr NosError //服務端返回的原始錯誤內容
}
type NosError struct {
Code string
Message string
Resource string
NosRequestId string //請求ID,非常重要,有利於nos開發人員跟蹤異常請求的錯誤原因
}
Next Previous
最後更新:2017-01-03 10:48:53