Este tema describe cómo agregar parámetros en una solicitud de carga o descarga de objetos para establecer el límite de ancho de banda. De esta manera, se garantiza que haya suficiente ancho de banda disponibles para otras aplicaciones.
Notas
En este tema se utiliza el endpoint público de la región China (Hangzhou). Si necesita acceder a OSS desde otros servicios de Alibaba Cloud ubicados en la misma región que OSS, utilice un endpoint interno. Para obtener más información sobre las regiones y los endpoints de OSS, consulte Regions and endpoints.
Las credenciales de acceso de este tema se obtienen a partir de variables de entorno. Para conocer cómo configurar las credenciales de acceso, consulte Configure access credentials.
Aquí se muestra cómo crear una instancia de OSSClient con un endpoint de OSS. Para ver configuraciones alternativas, como usar un dominio personalizado o autenticarse con credenciales de Security Token Service (STS), consulte Configure a client (Go SDK V1).
Código de ejemplo
A continuación se muestra un ejemplo de código para configurar la limitación de ancho de banda por conexión única en cargas y descargas simples:
package main
import (
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
options := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
options = append(options, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
options = append(options, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", options...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// Specify the name of the bucket. Example: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// Specify the full path of the local file that you want to upload. Example: D:\\localpath\\examplefile.txt.
// If you do not specify the path of the local file, the local file is uploaded from the path of the project to which the sample program belongs.
localFilePath := "D:\\localpath\\examplefile.txt"
fd, err := os.Open(localFilePath)
if err != nil {
log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
}
defer fd.Close()
// Specify the bandwidth limit for the upload. The value of the parameter must be a number. Default unit: bit/s. In this example, the bandwidth limit is set to 5 MB/s.
var traffic int64 = 41943040
// Configure bandwidth throttling for object upload.
// Specify the full path of the object. Do not include the bucket name in the full path.
objectName := "exampledir/exampleobject.txt"
err = bucket.PutObject(objectName, fd, oss.TrafficLimitHeader(traffic))
if err != nil {
log.Fatalf("Failed to upload object '%s': %v", objectName, err)
}
// Configure bandwidth throttling for object download.
// Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. Then, specify the full path of the local file. Example: D:\\localpath\\exampleobject.txt.
downloadFilePath := "D:\\localpath\\exampleobject.txt"
err = bucket.GetObjectToFile(objectName, downloadFilePath, oss.TrafficLimitHeader(traffic))
if err != nil {
log.Fatalf("Failed to download object '%s' to '%s': %v", objectName, downloadFilePath, err)
}
log.Println("Upload and download completed successfully")
}
Escenarios comunes
Configurar la limitación de ancho de banda por conexión única para cargas multiparte
El siguiente código muestra cómo configurar la limitación de ancho de banda por conexión única en una carga multiparte:
package main
import (
"io"
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
options := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
options = append(options, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
options = append(options, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", options...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// Specify the name of the bucket. Example: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// Specify the bandwidth limit for the upload. The value of the parameter must be a number. Default unit: bit/s. In this example, the bandwidth limit is set to 5 MB/s.
traffic := int64(41943040)
// Upload a large object by using multipart upload.
// You can split an object into multiple parts based on the object size. In this example, the object is split into three parts.
localFilePath := "localFile"
chunks, err := oss.SplitFileByPartNum(localFilePath, 3)
if err != nil {
log.Fatalf("Failed to split file '%s': %v", localFilePath, err)
}
// Open the object.
fd, err := os.Open(localFilePath)
if err != nil {
log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
}
defer fd.Close()
// Initiate a multipart upload task for the object.
objectName := "exampledir/exampleobject.txt"
imur, err := bucket.InitiateMultipartUpload(objectName)
if err != nil {
log.Fatalf("Failed to initiate multipart upload for '%s': %v", objectName, err)
}
// Upload parts and configure bandwidth throttling.
var parts []oss.UploadPart
for _, chunk := range chunks {
_, err := fd.Seek(chunk.Offset, io.SeekStart)
if err != nil {
log.Fatalf("Failed to seek to offset %d in file '%s': %v", chunk.Offset, localFilePath, err)
}
part, err := bucket.UploadPart(imur, fd, chunk.Size, chunk.Number, oss.TrafficLimitHeader(traffic))
if err != nil {
log.Fatalf("Failed to upload part %d of '%s': %v", chunk.Number, objectName, err)
}
parts = append(parts, part)
}
// Complete the upload.
_, err = bucket.CompleteMultipartUpload(imur, parts)
if err != nil {
log.Fatalf("Failed to complete multipart upload for '%s': %v", objectName, err)
}
log.Println("Multipart upload completed successfully")
}
Configurar la limitación de ancho de banda para cargas por anexado
El siguiente código muestra cómo configurar la limitación de ancho de banda por conexión única al cargar archivos mediante anexado:
package main
import (
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
options := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
options = append(options, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
options = append(options, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", options...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// Specify the name of the bucket. Example: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// Specify the bandwidth limit for the upload. The value of the parameter must be a number. Default unit: bit/s. In this example, the bandwidth limit is set to 5 MB/s.
traffic := int64(41943040)
// Perform the append upload.
// localFileOne and localFileTwo indicates the full paths of the two local files to upload. After localFileOne is uploaded, localFileTwo is uploaded by using append upload.
localFileOne := "localFileOne"
localFileTwo := "localFileTwo"
// Open localFileOne.
fd1, err := os.Open(localFileOne)
if err != nil {
log.Fatalf("Failed to open local file '%s': %v", localFileOne, err)
}
defer fd1.Close()
// Open localFileTwo.
fd2, err := os.Open(localFileTwo)
if err != nil {
log.Fatalf("Failed to open local file '%s': %v", localFileTwo, err)
}
defer fd2.Close()
// Specify the full path of the object.
objectName := "exampledir/exampleobject.txt"
// Initiate nextPos.
var nextPos int64
// Append localFileOne.
nextPos, err = bucket.AppendObject(objectName, fd1, nextPos, oss.TrafficLimitHeader(traffic))
if err != nil {
log.Fatalf("Failed to append object '%s' from file '%s': %v", objectName, localFileOne, err)
}
// Append localFileTwo.
nextPos, err = bucket.AppendObject(objectName, fd2, nextPos, oss.TrafficLimitHeader(traffic))
if err != nil {
log.Fatalf("Failed to append object '%s' from file '%s': %v", objectName, localFileTwo, err)
}
log.Println("Append upload completed successfully")
}
Configurar la limitación de ancho de banda para cargas y descargas con URL firmadas
Cuando utilice URL firmadas para cargar o descargar objetos, aplique la limitación de ancho de banda por conexión única tal como se indica en el siguiente ejemplo:
package main
import (
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Failed to create credentials provider: %v", err)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your actual endpoint.
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou. Specify the actual region.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Specify the version of the signature algorithm.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Failed to create OSS client: %v", err)
}
// Specify the name of the bucket. Example: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Failed to get bucket '%s': %v", bucketName, err)
}
// Use the signed URL to upload the object.
// Specify the full path of the local file to upload. Example: D:\\localpath\\exampleobject.txt.
localFilePath := "D:\\localpath\\exampleobject.txt"
fd, err := os.Open(localFilePath)
if err != nil {
log.Fatalf("Failed to open local file '%s': %v", localFilePath, err)
}
defer fd.Close()
// Specify the bandwidth limit for the upload. The value of the parameter must be a number. Default unit: bit/s. In this example, the bandwidth limit is set to 5 MB/s.
traffic := int64(41943040)
// Obtain the signed URL used to upload the object.
// Specify the full path of the object. Do not include the bucket name in the full path.
objectName := "exampledir/exampleobject.txt"
strURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60, oss.TrafficLimitParam(traffic))
if err != nil {
log.Fatalf("Failed to generate signed URL for uploading '%s': %v", objectName, err)
}
// Upload the local file.
err = bucket.PutObjectWithURL(strURL, fd)
if err != nil {
log.Fatalf("Failed to upload object '%s': %v", objectName, err)
}
// Use the signed URL to download the object.
// Obtain the signed URL that is used to download the object.
strURL, err = bucket.SignURL(objectName, oss.HTTPGet, 60, oss.TrafficLimitParam(traffic))
if err != nil {
log.Fatalf("Failed to generate signed URL for downloading '%s': %v", objectName, err)
}
// Specify the full path to which you want to download the object.
downloadFilePath := "D:\\localpath\\exampleobject.txt"
err = bucket.GetObjectToFileWithURL(strURL, downloadFilePath)
if err != nil {
log.Fatalf("Failed to download object '%s' to '%s': %v", objectName, downloadFilePath, err)
}
log.Println("Upload and download completed successfully")
}
Referencias
Para obtener más información sobre la operación de API que permite cargar un objeto, consulte PutObject.
Si desea conocer más detalles sobre la operación de API para descargar objetos, consulte GetObjectToFile.