O download por intervalo permite que você baixe um intervalo específico de bytes de um objeto, em vez do arquivo inteiro.
Notas de uso
O código de exemplo usa o ID da região China (Hangzhou)
cn-hangzhoue um endpoint público. Para acessar o OSS a partir de outros serviços da Alibaba Cloud na mesma região, use um endpoint interno. Para obter mais informações sobre as regiões e os endpoints compatíveis, consulte Regions and endpoints.Neste tópico, as credenciais de acesso são obtidas a partir de variáveis de ambiente. Para obter mais informações, consulte Configure access credentials.
Permissões
Por padrão, uma conta Alibaba Cloud tem permissões totais. Os usuários ou funções do RAM em uma conta Alibaba Cloud não têm permissões por padrão. A conta Alibaba Cloud ou o administrador da conta deve conceder as permissões de operação por meio do RAM policies ou Bucket Policy.
|
API |
Ação |
Descrição |
|
GetObject |
|
Baixa um objeto. |
|
|
Ao baixar um objeto, se você especificar a versão do objeto por meio do versionId, essa permissão é necessária. |
|
|
|
Ao baixar um objeto, se os metadados do objeto contiverem X-Oss-Server-Side-Encryption: KMS, essa permissão é necessária. |
Definição do método
func (c *Client) GetObject(ctx context.Context, request *GetObjectRequest, optFns ...func(*Options)) (*GetObjectResult, error)
Parâmetros da requisição
|
Parâmetro |
Tipo |
Descrição |
|
ctx |
context.Context |
O contexto da requisição, que você pode usar para definir o tempo limite total da requisição. |
|
request |
*GetObjectRequest |
Os parâmetros da requisição. Defina o parâmetro Range e especifique o intervalo de download, e defina o parâmetro RangeBehavior para ativar o comportamento padrão de download por intervalo. Para obter mais informações, consulte GetObjectRequest. |
|
optFns |
...func(*Options) |
Opcional. Substituições de parâmetros no nível da operação. Para obter mais informações, consulte Options. |
Valores de retorno
|
Valor de retorno |
Tipo |
Descrição |
|
result |
*GetObjectResult |
A resposta da operação da API. Válido quando err é nil. Para obter mais informações, consulte GetObjectResult. |
|
err |
error |
A mensagem de erro. Diferente de nil se a requisição falhar. |
-
Para um objeto de 1.000 bytes, o intervalo de download válido vai do byte 0 ao byte 999. Se o intervalo especificado for inválido, o parâmetro Range não terá efeito. A resposta retorna um código de status 200 e o objeto inteiro é transferido. Os exemplos a seguir descrevem requisições inválidas e seus resultados:
Caso defina Range: bytes=500-2000, o fim do intervalo é inválido. A resposta retorna o arquivo inteiro e o código de status HTTP é 200.
Caso defina Range: bytes=1000-2000, o início do intervalo é inválido. A resposta retorna o arquivo inteiro e o código de status HTTP é 200.
-
Adicione o cabeçalho de requisição x-oss-range-behavior:standard e especifique o comportamento padrão de download por intervalo. Isso altera o comportamento de download do OSS para intervalos inválidos. Para um objeto de 1.000 bytes:
Caso defina Range: bytes=500-2000, o fim do intervalo é inválido. A resposta retorna os dados do byte 500 ao byte 999 e o código de status HTTP é 206.
Caso defina Range: bytes=1000-2000, o início do intervalo é inválido. A resposta retorna um código de status HTTP 416 e o código de erro InvalidRange.
Código de exemplo
O código de exemplo a seguir adiciona o cabeçalho de requisição RangeBehavior:standard para baixar um intervalo de bytes especificado com o comportamento de download padrão.
package main
import (
"context"
"flag"
"io"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// Define global variables.
var (
region string // The region.
bucketName string // The bucket name.
objectName string // The object name.
)
// The init function is used to initialize command-line parameters.
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
flag.StringVar(&objectName, "object", "", "The name of the object.")
}
func main() {
// Parse command-line parameters.
flag.Parse()
// Check whether the bucket name is empty.
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// Check whether the region is empty.
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// Check whether the object name is empty.
if len(objectName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, object name required")
}
// Load the default configurations and set the credential provider and region.
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// Create an OSS client.
client := oss.NewClient(cfg)
// Create a request to get the object.
request := &oss.GetObjectRequest{
Bucket: oss.Ptr(bucketName), // The bucket name.
Key: oss.Ptr(objectName), // The object name.
Range: oss.Ptr("bytes=15-35"), // Specify the download range.
RangeBehavior: oss.Ptr("standard"), // Specify the standard range download behavior.
}
// Execute the operation to get the object and process the result.
result, err := client.GetObject(context.TODO(), request)
if err != nil {
log.Fatalf("failed to get object %v", err)
}
defer result.Body.Close() // Make sure that the response body is closed when the function ends.
log.Printf("get object result:%#v\n", result)
// Read the content of the object.
data, _ := io.ReadAll(result.Body)
log.Printf("body:%s\n", data)
}
Referências
Para obter o código de exemplo completo, consulte o exemplo no GitHub.
Para obter a referência da API, consulte GetObject.