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 |
-
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.