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

简单上传和下载限速

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

package main

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

func main() {  

  // 创建OSSClient实例。
  // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")  
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 填写Bucket名称,例如examplebucket。
  bucket, err := client.Bucket("examplebucket")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 填写待上传的本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
  // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
  fd, err := os.Open("D:\\localpath\\examplefile.txt")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()

  // 设置上传限速,参数格式为数字,默认单位为bit/s。本示例设置限速值为5 MB/s。
  var traffic int64 = 41943040
  // 限速上传。
  // 填写Object的完整路径,完整路径中不包含Bucket名称。
  err = bucket.PutObject("exampledir/exampleobject.txt", fd, oss.TrafficLimitHeader(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 限速下载。
  // 依次填写Object的完整路径,完整路径中不包含Bucket名称(例如exampledir/exampleobject.txt)以及本地文件的完整路径(例如D:\\localpath\\exampleobject.txt)。
  err = bucket.GetObjectToFile("exampledir/exampleobject.txt", "D:\\localpath\\exampleobject.txt", 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("exampledir/exampleobject.txt", 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("exampledir/exampleobject.txt")
  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)
  }
}Part

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

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

package main

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

func main() {
  // 创建OSSClient实例。
  // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret") 
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 填写Bucket名称,例如examplebucket。
  bucket, err := client.Bucket("examplebucket")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }

  // 使用签名URL进行上传。
  // 填写本地文件的完整路径,例如D:\\localpath\\exampleobject.txt。
  fd, err := os.Open("D:\\localpath\\exampleobject.txt")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  defer fd.Close()

  // 设置上传限速,参数格式为数字,默认单位为bit/s。本示例设置限速值为5 MB/s。  
  var traffic int64 = 41943040
  // 获取上传文件的URL。
  // 填写Object的完整路径,完整路径中不包含Bucket名称。
  strURL, err := bucket.SignURL("exampledir/exampleobject.txt", 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("exampledir/exampleobject.txt", oss.HTTPGet, 60, oss.TrafficLimitParam(traffic))
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
  // 填写Object下载到本地文件的完整路径。
  err = bucket.GetObjectToFileWithURL(strURL, "D:\\localpath\\exampleobject.txt")
  if err != nil {
    fmt.Println("Error:", err)
    os.Exit(-1)
  }
}