全部产品
对象存储 OSS

下载文件

更新时间:2017-06-07 13:26:11   分享:   

OSS Go SDK提供了丰富的文件下载接口,用户可以通过以下方式从OSS中下载文件:

  • 下载到流io.ReadCloser
  • 下载到本地文件
  • 分片下载

下载到流io.ReadCloser

提示:

  • 下载的示例代码在sample/get_object.go

下载文件到流

    import (
        "fmt"
        "io/ioutil"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    body, err := bucket.GetObject("my-object")
    if err != nil {
        // HandleError(err)
    }
    data, err := ioutil.ReadAll(body)
    if err != nil {
        // HandleError(err)
    }
    body.Close()
    fmt.Println("data:", string(data))

注意:

  • io.ReadCloser数据读取完毕后,需要调用Close关闭。

下载文件到缓存

    import (
        "bytes"
        "io"
        "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    body, err := bucket.GetObject("my-object")
    if err != nil {
        // HandleError(err)
    }
    buf := new(bytes.Buffer)
    io.Copy(buf, body)
    body.Close()

下载文件到本地文件流

    import (
            "io"
            "os"
            "github.com/aliyun/aliyun-oss-go-sdk/oss"
    )

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    body, err := bucket.GetObject("my-object")
    if err != nil {
        // HandleError(err)
    }
    defer body.Close()

    fd, err := os.OpenFile("LocalFile", os.O_WRONLY|os.O_CREATE, 0660)
    if err != nil {
        // HandleError(err)  
    }
    defer fd.Close()

    io.Copy(fd, body)

下载到本地文件

    import "github.com/aliyun/aliyun-oss-go-sdk/oss"

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    err = bucket.GetObjectToFile("my-object", "LocalFile")
    if err != nil {
        // HandleError(err)
    }

分片下载

当下载大文件时,如果网络不稳定或者程序崩溃了,则整个下载就失败了。用户 不得不重头再来,这样做不仅浪费资源,在网络不稳定的情况下,往往重试多次 还是无法完成下载。 通过Bucket.DownloadFile接口来实现断点续传下载。它有以下参数:

  • objectKey 要下载的Object名字
  • filePath 下载到本地文件的路径
  • partSize 下载分片大小,从1B到5GB,单位是Byte
  • options 可选项,主要包括:
    • Routines 指定分片下载的并发数,默认是1,及不使用并发下载
    • Checkpoint 指定下载是否开启断点续传,及checkpoint文件的路径。默认断点续传功能关闭,checkpoint文件的路径可以指定为空,如果不指定则默认为与本地文件同 目录下的file.cpt,其中file是本地文件的名字
    • 下载时限定条件,请参看指定限定条件下载

其实现的原理是将要下载的Object分成若干个分片分别下载,最后所有分片都下 载成功后,完成整个文件的下载。在下载的过程中会记录当前下载的进度信息 (记录在checkpoint文件中)和已下载的分片,如果下载过程中某一分片下载失败,再次下 载时会从checkpoint文件中记录的点继续下载。这要求再次调用时要指定与上次 相同的checkpoint文件。下载完成后,checkpoint文件会被删除。

    import "github.com/aliyun/aliyun-oss-go-sdk/oss"

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    err = bucket.DownloadFile("my-object", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
    if err != nil {
        // HandleError(err)
    }

注意:

  • SDK会将下载的中间状态信息记录在cp文件中,所以要确保用户对cpt文 件有写权限
  • cpt文件记录了下载的中间状态信息并自带了校验,用户不能去编辑它,如 果cpt文件损坏则重新下载文件
  • 如果下载过程中待下载的Object发生了改变(ETag改变),或者part文件丢 失或被修改,则重新下载文件

提示:

  • 指定断点续传checkpoint文件路径使用oss.Checkpoint(true, "your-cp-file.cp")
  • 使用bucket.DownloadFile(objectKey, localFile, 100*1024),默认不使用分片并发下载、不启动断点续传

指定限定条件下载

下载文件时,用户可以指定一个或多个限定条件,所有的限定条件都满足时下载,不满足时报错不下载文件。 可以使用的限定条件如下:

参数 说明
IfModifiedSince 如果指定的时间早于实际修改时间,则正常传送。否则返回错误。
IfUnmodifiedSince 如果传入参数中的时间等于或者晚于文件实际修改时间,则正常传输文件;否则返回错误。
IfMatch 如果传入期望的ETag和object的 ETag匹配,则正常传输;否则返回错误。
IfNoneMatch 如果传入的ETag值和Object的ETag不匹配,则正常传输;否则返回错误。
    import "time"
    import "github.com/aliyun/aliyun-oss-go-sdk/oss"

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    date := time.Date(2015, time.November, 10, 23, 0, 0, 0, time.UTC)

    // 限定条件不满足,不下载文件
    err = bucket.GetObjectToFile("my-object", "LocalFile", oss.IfModifiedSince(date))
    if err == nil {
        // HandleError(err)
    }

    // 满足限定条件,下载文件
    err = bucket.GetObjectToFile("my-object", "LocalFile", oss.IfUnmodifiedSince(date))
    if err != nil {
        // HandleError(err)
    }

提示:

  • ETag的值可以通过Bucket.GetObjectDetailedMeta获取。
  • Bucket.GetObject,Bucket.GetObjectToFile,Bucket.DownloadFile都支持限定条件。

文件压缩下载

文件可以压缩下载,目前支持GZIP压缩。Bucket.GetObject、Bucket.GetObjectToFile支持压缩功能。

    import "github.com/aliyun/aliyun-oss-go-sdk/oss"

    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        // HandleError(err)
    }

    bucket, err := client.Bucket("my-bucket")
    if err != nil {
        // HandleError(err)
    }

    err = bucket.GetObjectToFile("my-object.txt", "LocalFile.gzip", oss.AcceptEncoding("gzip"))
    if err != nil {
        // HandleError(err)
    }
本文导读目录
本文导读目录
以上内容是否对您有帮助?