# Minio Go Client API文档 [![Slack](https://slack.minio.io/slack?type=svg)](https://slack.minio.io) ## 初使化Minio Client对象。 ## Minio ```go package main import ( "fmt" "github.com/minio/minio-go" ) func main() { // 使用ssl ssl := true // 初使化minio client对象。 minioClient, err := minio.New("play.minio.io:9000", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", ssl) if err != nil { fmt.Println(err) return } } ``` ## AWS S3 ```go package main import ( "fmt" "github.com/minio/minio-go" ) func main() { // 使用ssl ssl := true // 初使化minio client对象。 s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", ssl) if err != nil { fmt.Println(err) return } } ``` | 操作存储桶 | 操作对象 | 操作加密对象 | Presigned操作 | 存储桶策略/通知 | 客户端自定义设置 | | :--- | :--- | :--- | :--- | :--- | :--- | | [`MakeBucket`](#MakeBucket) | [`GetObject`](#GetObject) | [`NewSymmetricKey`](#NewSymmetricKey) | [`PresignedGetObject`](#PresignedGetObject) | [`SetBucketPolicy`](#SetBucketPolicy) | [`SetAppInfo`](#SetAppInfo) | | [`ListBuckets`](#ListBuckets) | [`PutObject`](#PutObject) | [`NewAsymmetricKey`](#NewAsymmetricKey) | [`PresignedPutObject`](#PresignedPutObject) | [`GetBucketPolicy`](#GetBucketPolicy) | [`SetCustomTransport`](#SetCustomTransport) | | [`BucketExists`](#BucketExists) | [`CopyObject`](#CopyObject) | [`GetEncryptedObject`](#GetEncryptedObject) | [`PresignedPostPolicy`](#PresignedPostPolicy) | [`ListBucketPolicies`](#ListBucketPolicies) | [`TraceOn`](#TraceOn) | | [`RemoveBucket`](#RemoveBucket) | [`StatObject`](#StatObject) | [`PutEncryptedObject`](#PutEncryptedObject) | | [`SetBucketNotification`](#SetBucketNotification) | [`TraceOff`](#TraceOff) | | [`ListObjects`](#ListObjects) | [`RemoveObject`](#RemoveObject) | [`NewSSEInfo`](#NewSSEInfo) | | [`GetBucketNotification`](#GetBucketNotification) | [`SetS3TransferAccelerate`](#SetS3TransferAccelerate) | | [`ListObjectsV2`](#ListObjectsV2) | [`RemoveObjects`](#RemoveObjects) | [`FPutEncryptedObject`](#FPutEncryptedObject) | | [`RemoveAllBucketNotification`](#RemoveAllBucketNotification) | | | [`ListIncompleteUploads`](#ListIncompleteUploads) | [`RemoveIncompleteUpload`](#RemoveIncompleteUpload) | | | [`ListenBucketNotification`](#ListenBucketNotification) | | | | [`FPutObject`](#FPutObject) | | | | | | | [`FGetObject`](#FGetObject) | | | | | | | [`ComposeObject`](#ComposeObject) | | | | | | | [`NewSourceInfo`](#NewSourceInfo) | | | | | | | [`NewDestinationInfo`](#NewDestinationInfo) | | | | | | | [`PutObjectWithContext`](#PutObjectWithContext) | | | | | | [`GetObjectWithContext`](#GetObjectWithContext) | | | | | | [`FPutObjectWithContext`](#FPutObjectWithContext) | | | | | | [`FGetObjectWithContext`](#FGetObjectWithContext) | | | | ## 1. 构造函数 ### New(endpoint, accessKeyID, secretAccessKey string, ssl bool) (*Client, error) 初使化一个新的client对象。 __参数__ |参数 | 类型 |描述 | |:---|:---| :---| |`endpoint` | _string_ |S3兼容对象存储服务endpoint | |`accessKeyID` |_string_ |对象存储的Access key | |`secretAccessKey` | _string_ |对象存储的Secret key | |`ssl` | _bool_ |true代表使用HTTPS | ### NewWithRegion(endpoint, accessKeyID, secretAccessKey string, ssl bool, region string) (*Client, error) 初使化minio client,带有region配置。和New()不同的是,NewWithRegion避免了bucket-location操作,所以会快那么一丢丢。如果你的应用只使用一个region的话可以用这个方法。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`endpoint` | _string_ |S3兼容对象存储服务endpoint | |`accessKeyID` |_string_ |对象存储的Access key | |`secretAccessKey` | _string_ |对象存储的Secret key | |`ssl` | _bool_ |true代表使用HTTPS | |`region`| _string_ | 对象存储的region | ## 2. 操作存储桶 ### MakeBucket(bucketName, location string) error 创建一个存储桶。 __参数__ | 参数 | 类型 | 描述 | |---|---|---| |`bucketName` | _string_ | 存储桶名称 | | `location` | _string_ | 存储桶被创建的region(地区),默认是us-east-1(美国东一区),下面列举的是其它合法的值。注意:如果用的是minio服务的话,resion是在它的配置文件中,(默认是us-east-1)。| | | |us-east-1 | | | |us-west-1 | | | |us-west-2 | | | |eu-west-1 | | | | eu-central-1| | | | ap-southeast-1| | | | ap-northeast-1| | | | ap-southeast-2| | | | sa-east-1| __示例__ ```go err = minioClient.MakeBucket("mybucket", "us-east-1") if err != nil { fmt.Println(err) return } fmt.Println("Successfully created mybucket.") ``` ### ListBuckets() ([]BucketInfo, error) 列出所有的存储桶。 | 参数 | 类型 | 描述 | |---|---|---| |`bucketList` | _[]minio.BucketInfo_ | 所有存储桶的list。 | __minio.BucketInfo__ | 参数 | 类型 | 描述 | |---|---|---| |`bucket.Name` | _string_ | 存储桶名称 | |`bucket.CreationDate` | _time.Time_ | 存储桶的创建时间 | __示例__ ```go buckets, err := minioClient.ListBuckets() if err != nil { fmt.Println(err) return } for _, bucket := range buckets { fmt.Println(bucket) } ``` ### BucketExists(bucketName string) (found bool, err error) 检查存储桶是否存在。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`found` | _bool_ | 存储桶是否存在 | |`err` | _error_ | 标准Error | __示例__ ```go found, err := minioClient.BucketExists("mybucket") if err != nil { fmt.Println(err) return } if found { fmt.Println("Bucket found") } ``` ### RemoveBucket(bucketName string) error 删除一个存储桶,存储桶必须为空才能被成功删除。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | __示例__ ```go err = minioClient.RemoveBucket("mybucket") if err != nil { fmt.Println(err) return } ``` ### ListObjects(bucketName, prefix string, recursive bool, doneCh chan struct{}) <-chan ObjectInfo 列举存储桶里的对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectPrefix` |_string_ | 要列举的对象前缀 | |`recursive` | _bool_ |`true`代表递归查找,`false`代表类似文件夹查找,以'/'分隔,不查子文件夹。 | |`doneCh` | _chan struct{}_ | 在该channel上结束ListObjects iterator的一个message。 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`objectInfo` | _chan minio.ObjectInfo_ |存储桶中所有对象的read channel,对象的格式如下: | __minio.ObjectInfo__ |属性 |类型 |描述 | |:---|:---| :---| |`objectInfo.Key` | _string_ |对象的名称 | |`objectInfo.Size` | _int64_ |对象的大小 | |`objectInfo.ETag` | _string_ |对象的MD5校验码 | |`objectInfo.LastModified` | _time.Time_ |对象的最后修改时间 | ```go // Create a done channel to control 'ListObjects' go routine. doneCh := make(chan struct{}) // Indicate to our routine to exit cleanly upon return. defer close(doneCh) isRecursive := true objectCh := minioClient.ListObjects("mybucket", "myprefix", isRecursive, doneCh) for object := range objectCh { if object.Err != nil { fmt.Println(object.Err) return } fmt.Println(object) } ``` ### ListObjectsV2(bucketName, prefix string, recursive bool, doneCh chan struct{}) <-chan ObjectInfo 使用listing API v2版本列举存储桶中的对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | | `objectPrefix` |_string_ | 要列举的对象前缀 | | `recursive` | _bool_ |`true`代表递归查找,`false`代表类似文件夹查找,以'/'分隔,不查子文件夹。 | |`doneCh` | _chan struct{}_ | 在该channel上结束ListObjects iterator的一个message。 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`objectInfo` | _chan minio.ObjectInfo_ |存储桶中所有对象的read channel | ```go // Create a done channel to control 'ListObjectsV2' go routine. doneCh := make(chan struct{}) // Indicate to our routine to exit cleanly upon return. defer close(doneCh) isRecursive := true objectCh := minioClient.ListObjectsV2("mybucket", "myprefix", isRecursive, doneCh) for object := range objectCh { if object.Err != nil { fmt.Println(object.Err) return } fmt.Println(object) } ``` ### ListIncompleteUploads(bucketName, prefix string, recursive bool, doneCh chan struct{}) <- chan ObjectMultipartInfo 列举存储桶中未完整上传的对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | | `prefix` |_string_ | 不完整上传的对象的前缀 | | `recursive` | _bool_ |`true`代表递归查找,`false`代表类似文件夹查找,以'/'分隔,不查子文件夹。 | |`doneCh` | _chan struct{}_ | 在该channel上结束ListIncompleteUploads iterator的一个message。 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`multiPartInfo` | _chan minio.ObjectMultipartInfo_ |multipart对象格式如下: | __minio.ObjectMultipartInfo__ |属性 |类型 |描述 | |:---|:---| :---| |`multiPartObjInfo.Key` | _string_ |未完整上传的对象的名称 | |`multiPartObjInfo.UploadID` | _string_ |未完整上传的对象的Upload ID | |`multiPartObjInfo.Size` | _int64_ |未完整上传的对象的大小 | __示例__ ```go // Create a done channel to control 'ListObjects' go routine. doneCh := make(chan struct{}) // Indicate to our routine to exit cleanly upon return. defer close(doneCh) isRecursive := true // Recursively list everything at 'myprefix' multiPartObjectCh := minioClient.ListIncompleteUploads("mybucket", "myprefix", isRecursive, doneCh) for multiPartObject := range multiPartObjectCh { if multiPartObject.Err != nil { fmt.Println(multiPartObject.Err) return } fmt.Println(multiPartObject) } ``` ## 3. 操作对象 ### GetObject(bucketName, objectName string, opts GetObjectOptions) (*Object, error) 返回对象数据的流,error是读流时经常抛的那些错。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`opts` | _minio.GetObjectOptions_ | GET请求的一些额外参数,像encryption,If-Match | __minio.GetObjectOptions__ |参数 | 类型 | 描述 | |:---|:---|:---| | `opts.Materials` | _encrypt.Materials_ | `encrypt`包提供的对流加密的接口,(更多信息,请看https://godoc.org/github.com/minio/minio-go) | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`object` | _*minio.Object_ |_minio.Object_代表了一个object reader。它实现了io.Reader, io.Seeker, io.ReaderAt and io.Closer接口。 | __示例__ ```go object, err := minioClient.GetObject("mybucket", "myobject", minio.GetObjectOptions{}) if err != nil { fmt.Println(err) return } localFile, err := os.Create("/tmp/local-file.jpg") if err != nil { fmt.Println(err) return } if _, err = io.Copy(localFile, object); err != nil { fmt.Println(err) return } ``` ### FGetObject(bucketName, objectName, filePath string, opts GetObjectOptions) error 下载并将文件保存到本地文件系统。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`filePath` | _string_ |下载后保存的路径 | |`opts` | _minio.GetObjectOptions_ | GET请求的一些额外参数,像encryption,If-Match | __示例__ ```go err = minioClient.FGetObject("mybucket", "myobject", "/tmp/myobject", minio.GetObjectOptions{}) if err != nil { fmt.Println(err) return } ``` ### GetObjectWithContext(ctx context.Context, bucketName, objectName string, opts GetObjectOptions) (*Object, error) 和GetObject操作是一样的,不过传入了取消请求的context。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`ctx` | _context.Context_ |请求上下文(Request context) | |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`opts` | _minio.GetObjectOptions_ | GET请求的一些额外参数,像encryption,If-Match | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`object` | _*minio.Object_ |_minio.Object_代表了一个object reader。它实现了io.Reader, io.Seeker, io.ReaderAt and io.Closer接口。 | __示例__ ```go ctx, cancel := context.WithTimeout(context.Background(), 100 * time.Second) defer cancel() object, err := minioClient.GetObjectWithContext(ctx, "mybucket", "myobject", minio.GetObjectOptions{}) if err != nil { fmt.Println(err) return } localFile, err := os.Create("/tmp/local-file.jpg") if err != nil { fmt.Println(err) return } if _, err = io.Copy(localFile, object); err != nil { fmt.Println(err) return } ``` ### FGetObjectWithContext(ctx context.Context, bucketName, objectName, filePath string, opts GetObjectOptions) error 和FGetObject操作是一样的,不过允许取消请求。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`ctx` | _context.Context_ |请求上下文 | |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`filePath` | _string_ |下载后保存的路径 | |`opts` | _minio.GetObjectOptions_ | GET请求的一些额外参数,像encryption,If-Match | __示例__ ```go ctx, cancel := context.WithTimeout(context.Background(), 100 * time.Second) defer cancel() err = minioClient.FGetObjectWithContext(ctx, "mybucket", "myobject", "/tmp/myobject", minio.GetObjectOptions{}) if err != nil { fmt.Println(err) return } ``` ### FGetEncryptedObject(bucketName, objectName, filePath string, materials encrypt.Materials) error 和FGetObject操作是一样的,不过会对加密请求进行解密。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`filePath` | _string_ |下载后保存的路径| |`materials` | _encrypt.Materials_ | `encrypt`包提供的对流加密的接口,(更多信息,请看https://godoc.org/github.com/minio/minio-go) | __示例__ ```go // Generate a master symmetric key key := encrypt.NewSymmetricKey([]byte("my-secret-key-00")) // Build the CBC encryption material cbcMaterials, err := encrypt.NewCBCSecureMaterials(key) if err != nil { fmt.Println(err) return } err = minioClient.FGetEncryptedObject("mybucket", "myobject", "/tmp/myobject", cbcMaterials) if err != nil { fmt.Println(err) return } ``` ### PutObject(bucketName, objectName string, reader io.Reader, objectSize int64,opts PutObjectOptions) (n int, err error) 当对象小于64MiB时,直接在一次PUT请求里进行上传。当大于64MiB时,根据文件的实际大小,PutObject会自动地将对象进行拆分成64MiB一块或更大一些进行上传。对象的最大大小是5TB。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`reader` | _io.Reader_ |任意实现了io.Reader的GO类型 | |`objectSize`| _int64_ |上传的对象的大小,-1代表未知。 | |`opts` | _minio.PutObjectOptions_ | 允许用户设置可选的自定义元数据,内容标题,加密密钥和用于分段上传操作的线程数量。 | __minio.PutObjectOptions__ |属性 | 类型 | 描述 | |:--- |:--- | :--- | | `opts.UserMetadata` | _map[string]string_ | 用户元数据的Map| | `opts.Progress` | _io.Reader_ | 获取上传进度的Reader | | `opts.ContentType` | _string_ | 对象的Content type, 例如"application/text" | | `opts.ContentEncoding` | _string_ | 对象的Content encoding,例如"gzip" | | `opts.ContentDisposition` | _string_ | 对象的Content disposition, "inline" | | `opts.CacheControl` | _string_ | 指定针对请求和响应的缓存机制,例如"max-age=600"| | `opts.EncryptMaterials` | _encrypt.Materials_ | `encrypt`包提供的对流加密的接口,(更多信息,请看https://godoc.org/github.com/minio/minio-go) | __示例__ ```go file, err := os.Open("my-testfile") if err != nil { fmt.Println(err) return } defer file.Close() fileStat, err := file.Stat() if err != nil { fmt.Println(err) return } n, err := minioClient.PutObject("mybucket", "myobject", file, fileStat.Size(), minio.PutObjectOptions{ContentType:"application/octet-stream"}) if err != nil { fmt.Println(err) return } fmt.Println("Successfully uploaded bytes: ", n) ``` API方法在minio-go SDK版本v3.0.3中提供的PutObjectWithSize,PutObjectWithMetadata,PutObjectStreaming和PutObjectWithProgress被替换为接受指向PutObjectOptions struct的指针的新的PutObject调用变体。 ### PutObjectWithContext(ctx context.Context, bucketName, objectName string, reader io.Reader, objectSize int64, opts PutObjectOptions) (n int, err error) 和PutObject是一样的,不过允许取消请求。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`ctx` | _context.Context_ |请求上下文 | |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`reader` | _io.Reader_ |任何实现io.Reader的Go类型 | |`objectSize`| _int64_ | 上传的对象的大小,-1代表未知 | |`opts` | _minio.PutObjectOptions_ |允许用户设置可选的自定义元数据,content-type,content-encoding,content-disposition以及cache-control headers,传递加密模块以加密对象,并可选地设置multipart put操作的线程数量。| __示例__ ```go ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second) defer cancel() file, err := os.Open("my-testfile") if err != nil { fmt.Println(err) return } defer file.Close() fileStat, err := file.Stat() if err != nil { fmt.Println(err) return } n, err := minioClient.PutObjectWithContext(ctx, "my-bucketname", "my-objectname", file, fileStat.Size(), minio.PutObjectOptions{ ContentType: "application/octet-stream", }) if err != nil { fmt.Println(err) return } fmt.Println("Successfully uploaded bytes: ", n) ``` ### CopyObject(dst DestinationInfo, src SourceInfo) error 通过在服务端对已存在的对象进行拷贝,实现新建或者替换对象。它支持有条件的拷贝,拷贝对象的一部分,以及在服务端的加解密。请查看`SourceInfo`和`DestinationInfo`两个类型来了解更多细节。 拷贝多个源文件到一个目标对象,请查看`ComposeObject` API。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`dst` | _minio.DestinationInfo_ |目标对象 | |`src` | _minio.SourceInfo_ |源对象 | __示例__ ```go // Use-case 1: Simple copy object with no conditions. // Source object src := minio.NewSourceInfo("my-sourcebucketname", "my-sourceobjectname", nil) // Destination object dst, err := minio.NewDestinationInfo("my-bucketname", "my-objectname", nil, nil) if err != nil { fmt.Println(err) return } // Copy object call err = minioClient.CopyObject(dst, src) if err != nil { fmt.Println(err) return } ``` ```go // Use-case 2: // Copy object with copy-conditions, and copying only part of the source object. // 1. that matches a given ETag // 2. and modified after 1st April 2014 // 3. but unmodified since 23rd April 2014 // 4. copy only first 1MiB of object. // Source object src := minio.NewSourceInfo("my-sourcebucketname", "my-sourceobjectname", nil) // Set matching ETag condition, copy object which matches the following ETag. src.SetMatchETagCond("31624deb84149d2f8ef9c385918b653a") // Set modified condition, copy object modified since 2014 April 1. src.SetModifiedSinceCond(time.Date(2014, time.April, 1, 0, 0, 0, 0, time.UTC)) // Set unmodified condition, copy object unmodified since 2014 April 23. src.SetUnmodifiedSinceCond(time.Date(2014, time.April, 23, 0, 0, 0, 0, time.UTC)) // Set copy-range of only first 1MiB of file. src.SetRange(0, 1024*1024-1) // Destination object dst, err := minio.NewDestinationInfo("my-bucketname", "my-objectname", nil, nil) if err != nil { fmt.Println(err) return } // Copy object call err = minioClient.CopyObject(dst, src) if err != nil { fmt.Println(err) return } ``` ### ComposeObject(dst minio.DestinationInfo, srcs []minio.SourceInfo) error 通过使用服务端拷贝实现钭多个源对象合并创建成一个新的对象。 __参数__ |参数 |类型 |描述 | |:---|:---|:---| |`dst` | _minio.DestinationInfo_ |要被创建的目标对象 | |`srcs` | _[]minio.SourceInfo_ |要合并的多个源对象 | __示例__ ```go // Prepare source decryption key (here we assume same key to // decrypt all source objects.) decKey := minio.NewSSEInfo([]byte{1, 2, 3}, "") // Source objects to concatenate. We also specify decryption // key for each src1 := minio.NewSourceInfo("bucket1", "object1", &decKey) src1.SetMatchETagCond("31624deb84149d2f8ef9c385918b653a") src2 := minio.NewSourceInfo("bucket2", "object2", &decKey) src2.SetMatchETagCond("f8ef9c385918b653a31624deb84149d2") src3 := minio.NewSourceInfo("bucket3", "object3", &decKey) src3.SetMatchETagCond("5918b653a31624deb84149d2f8ef9c38") // Create slice of sources. srcs := []minio.SourceInfo{src1, src2, src3} // Prepare destination encryption key encKey := minio.NewSSEInfo([]byte{8, 9, 0}, "") // Create destination info dst, err := minio.NewDestinationInfo("bucket", "object", &encKey, nil) if err != nil { fmt.Println(err) return } // Compose object call by concatenating multiple source files. err = minioClient.ComposeObject(dst, srcs) if err != nil { fmt.Println(err) return } fmt.Println("Composed object successfully.") ``` ### NewSourceInfo(bucket, object string, decryptSSEC *SSEInfo) SourceInfo 构建一个可用于服务端拷贝操作(像`CopyObject`和`ComposeObject`)的`SourceInfo`对象。该对象可用于给源对象设置拷贝条件。 __参数__ | 参数 | 类型 | 描述 | | :--- | :--- | :--- | | `bucket` | _string_ | 源存储桶 | | `object` | _string_ | 源对象 | | `decryptSSEC` | _*minio.SSEInfo_ | 源对象的解密信息 (`nil`代表不用解密) | __示例__ ```go // No decryption parameter. src := minio.NewSourceInfo("bucket", "object", nil) // Destination object dst, err := minio.NewDestinationInfo("my-bucketname", "my-objectname", nil, nil) if err != nil { fmt.Println(err) return } // Copy object call err = minioClient.CopyObject(dst, src) if err != nil { fmt.Println(err) return } ``` ```go // With decryption parameter. decKey := minio.NewSSEInfo([]byte{1,2,3}, "") src := minio.NewSourceInfo("bucket", "object", &decKey) // Destination object dst, err := minio.NewDestinationInfo("my-bucketname", "my-objectname", nil, nil) if err != nil { fmt.Println(err) return } // Copy object call err = minioClient.CopyObject(dst, src) if err != nil { fmt.Println(err) return } ``` ### NewDestinationInfo(bucket, object string, encryptSSEC *SSEInfo, userMeta map[string]string) (DestinationInfo, error) 构建一个用于服务端拷贝操作(像`CopyObject`和`ComposeObject`)的用作目标对象的`DestinationInfo`。 __参数__ | 参数 | 类型 | 描述 | | :--- | :--- | :--- | | `bucket` | _string_ | 目标存储桶名称 | | `object` | _string_ | 目标对象名称 | | `encryptSSEC` | _*minio.SSEInfo_ | 源对象的加密信息 (`nil`代表不用加密) | | `userMeta` | _map[string]string_ | 给目标对象的用户元数据,如果是nil,并只有一个源对象,则将源对象的用户元数据拷贝给目标对象。| __示例__ ```go // No encryption parameter. src := minio.NewSourceInfo("bucket", "object", nil) dst, err := minio.NewDestinationInfo("bucket", "object", nil, nil) if err != nil { fmt.Println(err) return } // Copy object call err = minioClient.CopyObject(dst, src) if err != nil { fmt.Println(err) return } ``` ```go src := minio.NewSourceInfo("bucket", "object", nil) // With encryption parameter. encKey := minio.NewSSEInfo([]byte{1,2,3}, "") dst, err := minio.NewDestinationInfo("bucket", "object", &encKey, nil) if err != nil { fmt.Println(err) return } // Copy object call err = minioClient.CopyObject(dst, src) if err != nil { fmt.Println(err) return } ``` ### FPutObject(bucketName, objectName, filePath, opts PutObjectOptions) (length int64, err error) 将filePath对应的文件内容上传到一个对象中。 当对象小于64MiB时,FPutObject直接在一次PUT请求里进行上传。当大于64MiB时,根据文件的实际大小,FPutObject会自动地将对象进行拆分成64MiB一块或更大一些进行上传。对象的最大大小是5TB。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`filePath` | _string_ |要上传的文件的路径 | |`opts` | _minio.PutObjectOptions_ |允许用户设置可选的自定义元数据,content-type,content-encoding,content-disposition以及cache-control headers,传递加密模块以加密对象,并可选地设置multipart put操作的线程数量。 | __示例__ ```go n, err := minioClient.FPutObject("my-bucketname", "my-objectname", "my-filename.csv", minio.PutObjectOptions{ ContentType: "application/csv", }); if err != nil { fmt.Println(err) return } fmt.Println("Successfully uploaded bytes: ", n) ``` ### FPutObjectWithContext(ctx context.Context, bucketName, objectName, filePath, opts PutObjectOptions) (length int64, err error) 和FPutObject操作是一样的,不过允许取消请求。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`ctx` | _context.Context_ |请求上下文 | |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`filePath` | _string_ |要上传的文件的路径 | |`opts` | _minio.PutObjectOptions_ |允许用户设置可选的自定义元数据,content-type,content-encoding,content-disposition以及cache-control headers,传递加密模块以加密对象,并可选地设置multipart put操作的线程数量。 | __示例__ ```go ctx, cancel := context.WithTimeout(context.Background(), 100 * time.Second) defer cancel() n, err := minioClient.FPutObjectWithContext(ctx, "mybucket", "myobject.csv", "/tmp/otherobject.csv", minio.PutObjectOptions{ContentType:"application/csv"}) if err != nil { fmt.Println(err) return } fmt.Println("Successfully uploaded bytes: ", n) ``` ### StatObject(bucketName, objectName string, opts StatObjectOptions) (ObjectInfo, error) 获取对象的元数据。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`opts` | _minio.StatObjectOptions_ | GET info/stat请求的一些额外参数,像encryption,If-Match | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`objInfo` | _minio.ObjectInfo_ |对象stat信息 | __minio.ObjectInfo__ |属性 |类型 |描述 | |:---|:---| :---| |`objInfo.LastModified` | _time.Time_ |对象的最后修改时间 | |`objInfo.ETag` | _string_ |对象的MD5校验码| |`objInfo.ContentType` | _string_ |对象的Content type| |`objInfo.Size` | _int64_ |对象的大小| __示例__ ```go objInfo, err := minioClient.StatObject("mybucket", "myobject", minio.StatObjectOptions{}) if err != nil { fmt.Println(err) return } fmt.Println(objInfo) ``` ### RemoveObject(bucketName, objectName string) error 删除一个对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | ```go err = minioClient.RemoveObject("mybucket", "myobject") if err != nil { fmt.Println(err) return } ``` ### RemoveObjects(bucketName string, objectsCh chan string) (errorCh <-chan RemoveObjectError) 从一个input channel里删除一个对象集合。一次发送到服务端的删除请求最多可删除1000个对象。通过error channel返回的错误信息。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectsCh` | _chan string_ | 要删除的对象的channel | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`errorCh` | _<-chan minio.RemoveObjectError_ | 删除时观察到的错误的Receive-only channel。 | ```go objectsCh := make(chan string) // Send object names that are needed to be removed to objectsCh go func() { defer close(objectsCh) // List all objects from a bucket-name with a matching prefix. for object := range minioClient.ListObjects("my-bucketname", "my-prefixname", true, nil) { if object.Err != nil { log.Fatalln(object.Err) } objectsCh <- object.Key } }() for rErr := range minioClient.RemoveObjects("mybucket", objectsCh) { fmt.Println("Error detected during deletion: ", rErr) } ``` ### RemoveIncompleteUpload(bucketName, objectName string) error 删除一个未完整上传的对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | __示例__ ```go err = minioClient.RemoveIncompleteUpload("mybucket", "myobject") if err != nil { fmt.Println(err) return } ``` ## 4. 操作加密对象 ### NewSymmetricKey(key []byte) *encrypt.SymmetricKey __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`key` | _string_ |存储桶名称 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`symmetricKey` | _*encrypt.SymmetricKey_ | 加密解密的对称秘钥 | ```go symKey := encrypt.NewSymmetricKey([]byte("my-secret-key-00")) // Build the CBC encryption material with symmetric key. cbcMaterials, err := encrypt.NewCBCSecureMaterials(symKey) if err != nil { fmt.Println(err) return } fmt.Println("Successfully initialized Symmetric key CBC materials", cbcMaterials) object, err := minioClient.GetEncryptedObject("mybucket", "myobject", cbcMaterials) if err != nil { fmt.Println(err) return } defer object.Close() ``` ### NewAsymmetricKey(privateKey []byte, publicKey[]byte) (*encrypt.AsymmetricKey, error) __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`privateKey` | _[]byte_ | Private key数据 | |`publicKey` | _[]byte_ | Public key数据 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`asymmetricKey` | _*encrypt.AsymmetricKey_ | 加密解密的非对称秘钥 | |`err` | _error_ | 标准Error | ```go privateKey, err := ioutil.ReadFile("private.key") if err != nil { fmt.Println(err) return } publicKey, err := ioutil.ReadFile("public.key") if err != nil { fmt.Println(err) return } // Initialize the asymmetric key asymmetricKey, err := encrypt.NewAsymmetricKey(privateKey, publicKey) if err != nil { fmt.Println(err) return } // Build the CBC encryption material for asymmetric key. cbcMaterials, err := encrypt.NewCBCSecureMaterials(asymmetricKey) if err != nil { fmt.Println(err) return } fmt.Println("Successfully initialized Asymmetric key CBC materials", cbcMaterials) object, err := minioClient.GetEncryptedObject("mybucket", "myobject", cbcMaterials) if err != nil { fmt.Println(err) return } defer object.Close() ``` ### GetEncryptedObject(bucketName, objectName string, encryptMaterials encrypt.Materials) (io.ReadCloser, error) 返回对象的解密流。读流时的常见错误。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ | 存储桶名称 | |`objectName` | _string_ | 对象的名称 | |`encryptMaterials` | _encrypt.Materials_ | `encrypt`包提供的对流加密的接口,(更多信息,请看https://godoc.org/github.com/minio/minio-go) | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`stream` | _io.ReadCloser_ | 返回对象的reader,调用者需要在读取之后进行关闭。 | |`err` | _error | 错误信息 | __示例__ ```go // Generate a master symmetric key key := encrypt.NewSymmetricKey([]byte("my-secret-key-00")) // Build the CBC encryption material cbcMaterials, err := encrypt.NewCBCSecureMaterials(key) if err != nil { fmt.Println(err) return } object, err := minioClient.GetEncryptedObject("mybucket", "myobject", cbcMaterials) if err != nil { fmt.Println(err) return } defer object.Close() localFile, err := os.Create("/tmp/local-file.jpg") if err != nil { fmt.Println(err) return } defer localFile.Close() if _, err = io.Copy(localFile, object); err != nil { fmt.Println(err) return } ``` ### PutEncryptedObject(bucketName, objectName string, reader io.Reader, encryptMaterials encrypt.Materials) (n int, err error) 加密并上传对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`reader` | _io.Reader_ |任何实现io.Reader的Go类型 | |`encryptMaterials` | _encrypt.Materials_ | `encrypt`包提供的对流加密的接口,(更多信息,请看https://godoc.org/github.com/minio/minio-go) | __示例__ ```go // Load a private key privateKey, err := ioutil.ReadFile("private.key") if err != nil { fmt.Println(err) return } // Load a public key publicKey, err := ioutil.ReadFile("public.key") if err != nil { fmt.Println(err) return } // Build an asymmetric key key, err := encrypt.NewAsymmetricKey(privateKey, publicKey) if err != nil { fmt.Println(err) return } // Build the CBC encryption module cbcMaterials, err := encrypt.NewCBCSecureMaterials(key) if err != nil { fmt.Println(err) return } // Open a file to upload file, err := os.Open("my-testfile") if err != nil { fmt.Println(err) return } defer file.Close() // Upload the encrypted form of the file n, err := minioClient.PutEncryptedObject("mybucket", "myobject", file, cbcMaterials) if err != nil { fmt.Println(err) return } fmt.Println("Successfully uploaded encrypted bytes: ", n) ``` ### FPutEncryptedObject(bucketName, objectName, filePath, encryptMaterials encrypt.Materials) (n int, err error) 通过一个文件进行加密并上传到对象。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`filePath` | _string_ |要上传的文件的路径 | |`encryptMaterials` | _encrypt.Materials_ | `encrypt`包提供的对流加密的接口,(更多信息,请看https://godoc.org/github.com/minio/minio-go) | __示例__ ```go // Load a private key privateKey, err := ioutil.ReadFile("private.key") if err != nil { fmt.Println(err) return } // Load a public key publicKey, err := ioutil.ReadFile("public.key") if err != nil { fmt.Println(err) return } // Build an asymmetric key key, err := encrypt.NewAsymmetricKey(privateKey, publicKey) if err != nil { fmt.Println(err) return } // Build the CBC encryption module cbcMaterials, err := encrypt.NewCBCSecureMaterials(key) if err != nil { fmt.Println(err) return } n, err := minioClient.FPutEncryptedObject("mybucket", "myobject.csv", "/tmp/otherobject.csv", cbcMaterials) if err != nil { fmt.Println(err) return } fmt.Println("Successfully uploaded encrypted bytes: ", n) ``` ### NewSSEInfo(key []byte, algo string) SSEInfo 创建一个通过用户提供的key(SSE-C),进行服务端加解密操作的key对象。 __参数__ | 参数 | 类型 | 描述 | | :--- | :--- | :--- | | `key` | _[]byte_ | 未编码的二进制key数组 | | `algo` | _string_ | 加密算法,可以为空(默认是`AES256`) | ## 5. Presigned操作 ### PresignedGetObject(bucketName, objectName string, expiry time.Duration, reqParams url.Values) (*url.URL, error) 生成一个用于HTTP GET操作的presigned URL。浏览器/移动客户端可以在即使存储桶为私有的情况下也可以通过这个URL进行下载。这个presigned URL可以有一个过期时间,默认是7天。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`expiry` | _time.Duration_ |presigned URL的过期时间,单位是秒 | |`reqParams` | _url.Values_ |额外的响应头,支持_response-expires_, _response-content-type_, _response-cache-control_, _response-content-disposition_。 | __示例__ ```go // Set request parameters for content-disposition. reqParams := make(url.Values) reqParams.Set("response-content-disposition", "attachment; filename=\"your-filename.txt\"") // Generates a presigned url which expires in a day. presignedURL, err := minioClient.PresignedGetObject("mybucket", "myobject", time.Second * 24 * 60 * 60, reqParams) if err != nil { fmt.Println(err) return } fmt.Println("Successfully generated presigned URL", presignedURL) ``` ### PresignedPutObject(bucketName, objectName string, expiry time.Duration) (*url.URL, error) 生成一个用于HTTP GET操作的presigned URL。浏览器/移动客户端可以在即使存储桶为私有的情况下也可以通过这个URL进行下载。这个presigned URL可以有一个过期时间,默认是7天。 注意:你可以通过只指定对象名称上传到S3。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`expiry` | _time.Duration_ |presigned URL的过期时间,单位是秒 | __示例__ ```go // Generates a url which expires in a day. expiry := time.Second * 24 * 60 * 60 // 1 day. presignedURL, err := minioClient.PresignedPutObject("mybucket", "myobject", expiry) if err != nil { fmt.Println(err) return } fmt.Println("Successfully generated presigned URL", presignedURL) ``` ### PresignedHeadObject(bucketName, objectName string, expiry time.Duration, reqParams url.Values) (*url.URL, error) 生成一个用于HTTP GET操作的presigned URL。浏览器/移动客户端可以在即使存储桶为私有的情况下也可以通过这个URL进行下载。这个presigned URL可以有一个过期时间,默认是7天。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectName` | _string_ |对象的名称 | |`expiry` | _time.Duration_ |presigned URL的过期时间,单位是秒 | |`reqParams` | _url.Values_ |额外的响应头,支持_response-expires_, _response-content-type_, _response-cache-control_, _response-content-disposition_。 | __示例__ ```go // Set request parameters for content-disposition. reqParams := make(url.Values) reqParams.Set("response-content-disposition", "attachment; filename=\"your-filename.txt\"") // Generates a presigned url which expires in a day. presignedURL, err := minioClient.PresignedHeadObject("mybucket", "myobject", time.Second * 24 * 60 * 60, reqParams) if err != nil { fmt.Println(err) return } fmt.Println("Successfully generated presigned URL", presignedURL) ``` ### PresignedPostPolicy(PostPolicy) (*url.URL, map[string]string, error) 允许给POST操作的presigned URL设置策略条件。这些策略包括比如,接收对象上传的存储桶名称,名称前缀,过期策略。 ```go // Initialize policy condition config. policy := minio.NewPostPolicy() // Apply upload policy restrictions: policy.SetBucket("mybucket") policy.SetKey("myobject") policy.SetExpires(time.Now().UTC().AddDate(0, 0, 10)) // expires in 10 days // Only allow 'png' images. policy.SetContentType("image/png") // Only allow content size in range 1KB to 1MB. policy.SetContentLengthRange(1024, 1024*1024) // Add a user metadata using the key "custom" and value "user" policy.SetUserMetadata("custom", "user") // Get the POST form key/value object: url, formData, err := minioClient.PresignedPostPolicy(policy) if err != nil { fmt.Println(err) return } // POST your content from the command line using `curl` fmt.Printf("curl ") for k, v := range formData { fmt.Printf("-F %s=%s ", k, v) } fmt.Printf("-F file=@/etc/bash.bashrc ") fmt.Printf("%s\n", url) ``` ## 6. 存储桶策略/通知 ### SetBucketPolicy(bucketname, objectPrefix string, policy policy.BucketPolicy) error 给存储桶或者对象前缀设置访问权限。 必须引入`github.com/minio/minio-go/pkg/policy`包。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称| |`objectPrefix` | _string_ |对象的名称前缀| |`policy` | _policy.BucketPolicy_ |Policy的取值如下: | | | | _policy.BucketPolicyNone_ | | | | _policy.BucketPolicyReadOnly_ | | | | _policy.BucketPolicyReadWrite_ | | | | _policy.BucketPolicyWriteOnly_ | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`err` | _error_ |标准Error | __示例__ ```go // Sets 'mybucket' with a sub-directory 'myprefix' to be anonymously accessible for // both read and write operations. err = minioClient.SetBucketPolicy("mybucket", "myprefix", policy.BucketPolicyReadWrite) if err != nil { fmt.Println(err) return } ``` ### GetBucketPolicy(bucketName, objectPrefix string) (policy.BucketPolicy, error) 获取存储桶或者对象前缀的访问权限。 必须引入`github.com/minio/minio-go/pkg/policy`包。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectPrefix` | _string_ |该存储桶下的对象前缀 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketPolicy` | _policy.BucketPolicy_ |取值如下: `none`, `readonly`, `readwrite`,或者`writeonly` | |`err` | _error_ |标准Error | __示例__ ```go bucketPolicy, err := minioClient.GetBucketPolicy("mybucket", "") if err != nil { fmt.Println(err) return } fmt.Println("Access permissions for mybucket is", bucketPolicy) ``` ### ListBucketPolicies(bucketName, objectPrefix string) (map[string]BucketPolicy, error) 获取指定的存储桶和前缀的访问策略。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`objectPrefix` | _string_ |该存储桶下的对象前缀 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketPolicies` | _map[string]minio.BucketPolicy_ |对象以及它们的权限的Map | |`err` | _error_ |标准Error | __示例__ ```go bucketPolicies, err := minioClient.ListBucketPolicies("mybucket", "") if err != nil { fmt.Println(err) return } for resource, permission := range bucketPolicies { fmt.Println(resource, " => ", permission) } ``` ### GetBucketNotification(bucketName string) (BucketNotification, error) 获取存储桶的通知配置 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketNotification` | _minio.BucketNotification_ |含有所有通知配置的数据结构| |`err` | _error_ |标准Error | __示例__ ```go bucketNotification, err := minioClient.GetBucketNotification("mybucket") if err != nil { fmt.Println("Failed to get bucket notification configurations for mybucket", err) return } for _, queueConfig := range bucketNotification.QueueConfigs { for _, e := range queueConfig.Events { fmt.Println(e + " event is enabled") } } ``` ### SetBucketNotification(bucketName string, bucketNotification BucketNotification) error 给存储桶设置新的通知 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | |`bucketNotification` | _minio.BucketNotification_ |发送给配置的web service的XML | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`err` | _error_ |标准Error | __示例__ ```go queueArn := minio.NewArn("aws", "sqs", "us-east-1", "804605494417", "PhotoUpdate") queueConfig := minio.NewNotificationConfig(queueArn) queueConfig.AddEvents(minio.ObjectCreatedAll, minio.ObjectRemovedAll) queueConfig.AddFilterPrefix("photos/") queueConfig.AddFilterSuffix(".jpg") bucketNotification := minio.BucketNotification{} bucketNotification.AddQueue(queueConfig) err = minioClient.SetBucketNotification("mybucket", bucketNotification) if err != nil { fmt.Println("Unable to set the bucket notification: ", err) return } ``` ### RemoveAllBucketNotification(bucketName string) error 删除存储桶上所有配置的通知 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ |存储桶名称 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`err` | _error_ |标准Error | __示例__ ```go err = minioClient.RemoveAllBucketNotification("mybucket") if err != nil { fmt.Println("Unable to remove bucket notifications.", err) return } ``` ### ListenBucketNotification(bucketName, prefix, suffix string, events []string, doneCh <-chan struct{}) <-chan NotificationInfo ListenBucketNotification API通过notification channel接收存储桶通知事件。返回的notification channel有两个属性,'Records'和'Err'。 - 'Records'持有从服务器返回的通知信息。 - 'Err'表示的是处理接收到的通知时报的任何错误。 注意:一旦报错,notification channel就会关闭。 __参数__ |参数 |类型 |描述 | |:---|:---| :---| |`bucketName` | _string_ | 被监听通知的存储桶 | |`prefix` | _string_ | 过滤通知的对象前缀 | |`suffix` | _string_ | 过滤通知的对象后缀 | |`events` | _[]string_ | 开启指定事件类型的通知 | |`doneCh` | _chan struct{}_ | 在该channel上结束ListenBucketNotification iterator的一个message。 | __返回值__ |参数 |类型 |描述 | |:---|:---| :---| |`notificationInfo` | _chan minio.NotificationInfo_ | 存储桶通知的channel | __minio.NotificationInfo__ |属性 |类型 |描述 | |`notificationInfo.Records` | _[]minio.NotificationEvent_ | 通知事件的集合 | |`notificationInfo.Err` | _error_ | 操作时报的任何错误(标准Error) | __示例__ ```go // Create a done channel to control 'ListenBucketNotification' go routine. doneCh := make(chan struct{}) // Indicate a background go-routine to exit cleanly upon return. defer close(doneCh) // Listen for bucket notifications on "mybucket" filtered by prefix, suffix and events. for notificationInfo := range minioClient.ListenBucketNotification("mybucket", "myprefix/", ".mysuffix", []string{ "s3:ObjectCreated:*", "s3:ObjectAccessed:*", "s3:ObjectRemoved:*", }, doneCh) { if notificationInfo.Err != nil { fmt.Println(notificationInfo.Err) } fmt.Println(notificationInfo) } ``` ## 7. 客户端自定义设置 ### SetAppInfo(appName, appVersion string) 给User-Agent添加的自定义应用信息。 __参数__ | 参数 | 类型 | 描述 | |---|---|---| |`appName` | _string_ | 发请求的应用名称 | | `appVersion`| _string_ | 发请求的应用版本 | __示例__ ```go // Set Application name and version to be used in subsequent API requests. minioClient.SetAppInfo("myCloudApp", "1.0.0") ``` ### SetCustomTransport(customHTTPTransport http.RoundTripper) 重写默认的HTTP transport,通常用于调试或者添加自定义的TLS证书。 __参数__ | 参数 | 类型 | 描述 | |---|---|---| |`customHTTPTransport` | _http.RoundTripper_ | 自定义的transport,例如:为了调试对API请求响应进行追踪。| ### TraceOn(outputStream io.Writer) 开启HTTP tracing。追踪信息输出到io.Writer,如果outputstream为nil,则trace写入到os.Stdout标准输出。 __参数__ | 参数 | 类型 | 描述 | |---|---|---| |`outputStream` | _io.Writer_ | HTTP trace写入到outputStream | ### TraceOff() 关闭HTTP tracing。 ### SetS3TransferAccelerate(acceleratedEndpoint string) 给后续所有API请求设置ASW S3传输加速endpoint。 注意:此API仅对AWS S3有效,对其它S3兼容的对象存储服务不生效。 __参数__ | 参数 | 类型 | 描述 | |---|---|---| |`acceleratedEndpoint` | _string_ | 设置新的S3传输加速endpoint。| ## 8. 了解更多 - [用Go语言创建属于你的音乐播放器APP示例](https://docs.minio.io/docs/go-music-player-app)