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

  1. 支持跨桶的文件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)
}