6. 文件管理¶
在NOS中,用户可以通过一系列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,HeadObject等。
6.1. 列出桶中的文件¶
通过ListObjects方法获取用户桶下面的对象。可以设置的参数列表如下:
参数 | 作用 |
---|---|
Prefix | 限定返回的object key必须以prefix作为前缀 |
Delimiter | 是一个用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素——CommonPrefixes |
Marker | 字典序的起始标记,只列出该标记之后的部分 |
MaxKeys | 限定返回的数量,返回的结果小于或等于该值(默认值为100) |
示例代码如下:
resp,err := s3Client.ListObjects(&s3.ListObjectsInput{Bucket:aws.String(SrcBucket),
Prefix:aws.String(prefix),Delimiter:aws.String(delimiter),Marker:aws.String(marker)})
if err != nil {
fmt.Println(err.Error())
} else {
for _,value := range resp.Contents {
fmt.Println(*value.Key)
}
}
6.2. 判断文件是否存在¶
通过HeadObject方法来判断对象是否存在。示例代码如下:
func doObjectExist(s3Client *s3.S3,bucketName,objectName string)(bool){
resp,err := s3Client.HeadObject(&s3.HeadObjectInput{Bucket:aws.String(bucketName),
Key:aws.String(objectName)})
if err != nil {
fmt.Println("headObject " + err.Error())
return false;
} else {
fmt.Println(*resp.ETag)
return true
}
}
6.3. 删除单个文件¶
通过DeleteObject方法实现单个文件删除功能。示例代码如下:
func deleteObject(s3Client *s3.S3,bucketName,objectName string) {
resp,err := s3Client.DeleteObject(&s3.DeleteObjectInput{Bucket:aws.String(bucketName),Key:aws.String(objectName)})
if err != nil {
fmt.Println(err.Error())
return
} else {
fmt.Println(resp)
}
}
6.4. 删除多个文件¶
通过DeleteObjects方法实现多个文件删除功能。示例代码如下:
func deleteObjects(s3Client *s3.S3,bucketName string){
var objs []*s3.ObjectIdentifier
objs = append(objs,&s3.ObjectIdentifier{Key:aws.String("main")})
objs = append(objs,&s3.ObjectIdentifier{Key:aws.String("test")})
ds := &s3.Delete{Quiet:aws.Bool(false),Objects:objs}
resp,err := s3Client.DeleteObjects(&s3.DeleteObjectsInput{Bucket:aws.String(bucketName),Delete:ds,})
if err != nil {
fmt.Println("DeleteObjects : " + err.Error())
return
} else {
for _,deleted := range resp.Deleted{
fmt.Println("deleted : " + *deleted.Key)
}
for _,err := range resp.Errors {
fmt.Println("error : " + *err.Key)
}
}
}
6.5. 拷贝文件¶
通过CopyObject方法实现对象复制功能,NOS支持桶内copy以及相同用户的跨桶copy。示例代码如下:
func copyObject(s3Client *s3.S3,srcBucket,srcObject,destBucket,destObject string){
copyObjectInput := &s3.CopyObjectInput{
Bucket:aws.String(destBucket),
Key:aws.String(destObject),
CopySource:aws.String("/" + srcBucket + "/" + srcObject),//这里的格式必须要一致,不然NOS会报错,其他的格式后期兼容
}
_,err := s3Client.CopyObject(copyObjectInput)
if err != nil {
fmt.Println(err.Error())
return
}
}
Attention
- 支持跨桶的文件copy
6.6. 获取文件的文件元信息¶
通过HeadObject方法获取文件的元数据,在resp中读取想要的信息即可。示例代码如下:
func getObjectMeta(s3Client *s3.S3,bucketName,objectName string){
resp,err := s3Client.HeadObject(&s3.HeadObjectInput{Bucket:aws.String(bucketName),
Key:aws.String(objectName)})
if err != nil {
fmt.Println("headObject " + err.Error())
} else {
fmt.Println(*resp.ETag , *resp.ContentLength)
}
}
6.7. 生成私有对象可下载的URL链接¶
通过GetObjectRequest和Presign方法获取私有文件的可下载的URL。示例代码如下:
func getObjectDonwloadUrl(s3Client *s3.S3, bucketName, objectName string) {
req, _ := s3Client.GetObjectRequest(&s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectName),
})
urlStr, err := req.Presign(15 * time.Minute) //过期时间
if err != nil {
fmt.Println(err)
}
fmt.Println("The URL is", urlStr)
}