Todos os produtos
Search
Central de documentação

Object Storage Service:Download por intervalo (Python SDK V2)

Última atualização: Jul 03, 2026

Este tópico descreve como usar o download por intervalo para baixar eficientemente uma faixa específica de dados de um objeto.

Observações de uso

  • O código de exemplo neste tópico usa o ID da região cn-hangzhou, referente à região China (Hangzhou). Por padrão, o acesso aos recursos em um bucket ocorre via endpoint público. Para acessar os recursos do bucket a partir de outros serviços da Alibaba Cloud na mesma região, use um endpoint interno. Para mais informações sobre as regiões e endpoints compatíveis com o OSS, consulte Regiões e endpoints do OSS.

  • Para usar o download por intervalo, você precisa da permissão oss:GetObject. Para mais detalhes, consulte Conceder política personalizada a usuários RAM.

Definição do método

get_object(request: GetObjectRequest, **kwargs) → GetObjectResult

Parâmetros da solicitação

Parâmetro

Tipo

Descrição

request

*GetObjectRequest

Defina os parâmetros da solicitação para a interface específica, como configurar range_header para especificar o intervalo de download e definir range_behavior para estabelecer o comportamento padrão do download por intervalo. Para mais informações, consulte GetObjectRequest

Parâmetros de resposta

Tipo

Descrição

GetObjectResult

Resposta da operação. Este parâmetro fica disponível quando o valor de err é nil. Para mais informações, consulte GetObjectResult

Importante
  • Em um objeto com tamanho de 1.000 bytes, o intervalo válido vai do byte 0 ao byte 999. Se o intervalo especificado estiver fora de 0 a 999, ele não terá efeito. Nesse caso, o OSS retorna o código de status HTTP 200 e o objeto inteiro. Os exemplos a seguir mostram solicitações inválidas e seus respectivos resultados:

    • Ao definir Range: bytes como 500-2000, o fim do intervalo é inválido. Nessa situação, o OSS retorna o código de status HTTP 200 e o objeto completo.

    • Ao definir Range: bytes como 1000-2000, o início do intervalo é inválido. Nessa situação, o OSS retorna o código de status HTTP 200 e o objeto completo.

  • Adicione o cabeçalho x-oss-range-behavior:standard à solicitação para modifique o comportamento de download quando o intervalo especificado for inválido. Para um objeto de 1.000 bytes:

    • Se Range: bytes for definido como 500-2000, o fim do intervalo é inválido. O OSS retorna o código de status HTTP 206 e os dados do byte 500 ao byte 999.

    • Se Range: bytes for definido como 1000-2000, o início do intervalo é inválido. O OSS retorna o código de status HTTP 416 e o código de erro InvalidRange.

Código de exemplo

O código abaixo demonstra como adicionar o cabeçalho de solicitação RangeBehavior:standard a uma requisição. Esse cabeçalho define o comportamento padrão de download, que baixa os dados do arquivo dentro de um intervalo especificado.

import argparse
import alibabacloud_oss_v2 as oss

# Create a command-line parameter parser.
parser = argparse.ArgumentParser(description="Get object range sample")
# Add necessary command line parameters.
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--key', help='The name of the object.', required=True)
parser.add_argument('--range', help='Specify the scope of file transfer. Example value: bytes=0-9', required=True)
parser.add_argument('--range_behavior', help='Standard for downloading behavior within a specified range. Example value: standard.')

def main():
    # Parse the command-line parameters.
    args = parser.parse_args()

    # Load access credentials from environment variables.
    credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()

    # Use the default configuration of the SDK.
    cfg = oss.config.load_default()
    # Specify the credential provider.
    cfg.credentials_provider = credentials_provider
    # Specify the region.
    cfg.region = args.region
    # If an endpoint is provided from the command line, update the endpoint in the configuration with the provided endpoint.
    if args.endpoint is not None:
        cfg.endpoint = args.endpoint

    # Create an OSS client.
    client = oss.Client(cfg)

    # Initiate a request to get an object.
    result = client.get_object(oss.GetObjectRequest(
        bucket=args.bucket,  # Specify the name of the bucket
        key=args.key,  # Specify the key name of the object
        range_header=args.range,  # Specify the range header
        range_behavior=args.range_behavior,  # Specify the download behavior within the range
    ))

    # Print multiple attributes in the response.
    print(f'status code: {result.status_code},'
          f' request id: {result.request_id},'
          f' content length: {result.content_length},'
          f' content range: {result.content_range},'
          f' content type: {result.content_type},'
          f' etag: {result.etag},'
          f' last modified: {result.last_modified},'
          f' content md5: {result.content_md5},'
          f' cache control: {result.cache_control},'
          f' content disposition: {result.content_disposition},'
          f' content encoding: {result.content_encoding},'
          f' expires: {result.expires},'
          f' hash crc64: {result.hash_crc64},'
          f' storage class: {result.storage_class},'
          f' object type: {result.object_type},'
          f' version id: {result.version_id},'
          f' tagging count: {result.tagging_count},'
          f' server side encryption: {result.server_side_encryption},'
          f' server side data encryption: {result.server_side_data_encryption},'
          f' next append position: {result.next_append_position},'
          f' expiration: {result.expiration},'
          f' restore: {result.restore},'
          f' process status: {result.process_status},'
          f' delete marker: {result.delete_marker},'
    )

    # ========== Method 1: Read completely ==========
    # Use a context manager to ensure resource release.
    with result.body as body_stream:
        data = body_stream.read()
        print(f"File read completed, data length: {len(data)} bytes")

        path = "./get-object-sample.txt"
        with open(path, 'wb') as f:
            f.write(data)
        print(f"File download completed, saved to path: {path}")

    # # ========== Method 2: Read in chunks ==========
    # # Use a context manager to ensure resource release.
    # with result.body as body_stream:
    #     chunk_path = "./get-object-sample-chunks.txt"
    #     total_size = 0

    #     with open(chunk_path, 'wb') as f:
    #         # Use a block size of 256 KB (adjust block_size parameter as needed).
    #         for chunk in body_stream.iter_bytes(block_size=256 * 1024):
    #             f.write(chunk)
    #             total_size += len(chunk)
    #             print(f"Received data block: {len(chunk)} bytes | Total: {total_size} bytes")

    #     print(f"File download completed, saved to path: {chunk_path}")

# Call the main function when the script runs as the main program.
if __name__ == "__main__":
    main()

Referências

  • Para obter o código de exemplo completo sobre download por intervalo, consulte get_object_range.py.