本文介绍如何在上传、下载文件时,通过在请求中携带x-oss-traffic-limit参数并设置限速值,以保证其他应用的正常带宽。

说明 有关单链接限速的使用场景及注意事项的更多信息,请参考开发指南的 单链接限速文档。

普通上传下载限速

以下代码用于普通上传、下载文件时设置单链接限速:

package main

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

func main() {
  //
  // 单链接限速支持以下几个接口:
  // PutObject/AppendObject/PostObject/CopyObject/UploadPart/UploadPartCopy
  // 以下是各接口的使用示例。
  //

  // 创建OSSClient实例。
  client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 获取存储空间。
  bucket, err := client.Bucket("<yourBucketName>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 待上传本地文件。
  fd, err := os.Open("<yourLocalFile>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()

  // 上传速度上限 参数的内容为数字,默认单位为bit/s。 
  // 41943040 表示此请求限速40Mb/s,即5MB/s。
  var traffic int64 = 41943040
  // 示例一、限速上传。
  err = bucket.PutObject("<youObjectName>", fd, oss.TrafficLimitHeader(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 示例二、限速下载, newFile表示下载后文件的名称。
  err = bucket.GetObjectToFile("<youObjectName>", "newFile", oss.TrafficLimitHeader(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 示例三、追加上传,localFileOne和localFileTwo表示本地的两个文件,将localFileOne上传后,继续追加localFileTwo上传。
  localFileOne := "<localFileOne>"
  localFileTwo := "<localFileTwo>"
  fd1, err := os.Open(localFileOne)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()
  fd2, err := os.Open(localFileTwo)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()

  var nextPos int64
  nextPos, err = bucket.AppendObject("<yourObjectName>", fd1, nextPos, oss.TrafficLimitHeader(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  nextPos, err = bucket.AppendObject("<yourObjectName>", fd2, nextPos, oss.TrafficLimitHeader(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 示例四、大文件分片上传
  // 将文件分成3片上传,具体分片数可以视文件大小而定。
  chunks, err := oss.SplitFileByPartNum("localFile", 3)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 打开文件。
  fd, err = os.Open("fileName")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()
  // 初始化上传的文件,并设置限速大小。
  imur, err := bucket.InitiateMultipartUpload("<yourObjectName>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 分片上传并限速。
  var parts []oss.UploadPart
  for _, chunk := range chunks {
    fd.Seek(chunk.Offset, os.SEEK_SET)
    part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number, oss.TrafficLimitHeader(traffic))
  if err != nil {
  fmt.Println("Error:", err)
  os.Exit(-1)
  }
    parts = append(parts, part)
  }
  // 上传完成。
  _, err = bucket.CompleteMultipartUpload(imur, parts)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}

使用签名URL方式上传下载限速

以下代码用于使用签名URL方式上传、下载文件时设置单链接限速:

package main

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

func main() {
  // 创建OSSClient实例。
  client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 获取存储空间。
  bucket, err := client.Bucket("<yourBucketName>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 示例一、使用签名后的URL进行上传,
  // 
  // 打开一个本地文件
  fd, err := os.Open("<localfile>")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()

  // 设置上传限速,参数格式为数字,默认单位为bit/s。
  // 41943040表示此请求限速40Mb/s,即5MB/s。
  var traffic int64 = 41943040
  // 获取一个上传文件的url。
  strURL, err := bucket.SignURL("<yourObjectName>", oss.HTTPPut, 60, oss.TrafficLimitParam(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 上传本地文件。
  err = bucket.PutObjectWithURL(strURL, fd)
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 示例二、使用签名后的URL进行下载。
  // 获取一个下载文件的url。
  strURL, err = bucket.SignURL("<yourObjectName>", oss.HTTPGet, 60, oss.TrafficLimitParam(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 下载文件到本地, newFile表示下载后文件的名称。
  err = bucket.GetObjectToFileWithURL(strURL, "newFile")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}