全部产品
Search
文档中心

对象存储 OSS:Go单链接限速

更新时间:Dec 20, 2023

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

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

简单上传和下载限速

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

package main

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

func main() {

	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	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)
	}
}

分片上传限速

以下代码用于分片上传设置单链接限速:

package main

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

func main() {

    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    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)
    }
    // 设置上传限速,参数格式为数字,默认单位为bit/s。本示例设置限速值为5 MB/s。
    var traffic int64 = 41943040

    // 大文件分片上传。
    // 将文件分成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)
    }
}

追加上传限速

以下代码用于追加上传设置单链接限速:

package main

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

func main() {

    // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // 创建OSSClient实例。
    // yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
    client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
    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)
    }
    // 设置上传限速,参数格式为数字,默认单位为bit/s。本示例设置限速值为5 MB/s。
    var traffic int64 = 41943040
    // 追加上传。
    // localFileOne和localFileTwo表示待上传的两个本地文件的完整路径。上传localFileOne后,继续追加localFileTwo进行上传。
    localFileOne := "localFileOne"
    localFileTwo := "localFileTwo"
    fd1, err := os.Open(localFileOne)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    defer fd1.Close()
    fd2, err := os.Open(localFileTwo)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }
    defer fd2.Close()
    var nextPos int64
    objectName := "exampledir/exampleobject.txt"

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

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

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

package main

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

func main() {
	// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
	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)
	}
}