对象存储 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