Tous les produits
Search
Centre de documentation

Object Storage Service:Téléchargement par plage (SDK Python V2)

Dernière mise à jour :Aug 18, 2026

Cette rubrique explique comment utiliser le téléchargement par plage pour télécharger efficacement une plage de données spécifique depuis un objet.

Remarques sur l'utilisation

  • L'exemple de code de cette rubrique utilise l'ID de région cn-hangzhou pour la région Chine (Hangzhou). Par défaut, un endpoint public est utilisé pour accéder aux ressources d'un bucket. Si vous souhaitez accéder aux ressources du bucket depuis d'autres services Alibaba Cloud situés dans la même région, utilisez un endpoint interne. Pour plus d'informations sur les régions et les endpoints pris en charge par OSS, consultez Régions et endpoints OSS.

  • Pour utiliser le téléchargement par plage, vous devez disposer de l'autorisation oss:GetObject. Pour plus d'informations, consultez Accorder une politique personnalisée aux utilisateurs RAM.

Définition de la méthode

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

Paramètres de requête

Paramètre

Type

Description

request

*GetObjectRequest

Définissez les paramètres de requête pour l'interface spécifique, par exemple en définissant range_header pour spécifier la plage de téléchargement, et en définissant range_behavior pour spécifier le comportement standard du téléchargement par plage. Pour plus d'informations, consultez GetObjectRequest

Paramètres de réponse

Type

Description

GetObjectResult

Réponse à l'opération. Ce paramètre est disponible lorsque la valeur de err est nil. Pour plus d'informations, consultez GetObjectResult

Important
  • Pour un objet d'une taille de 1 000 octets, la plage valide s'étend de l'octet 0 à l'octet 999. Si la plage spécifiée se situe en dehors de la plage 0-999, elle n'est pas prise en compte. Dans ce cas, OSS renvoie le code d'état HTTP 200 et l'intégralité de l'objet. Les exemples suivants illustrent les requêtes non valides et leurs résultats :

    • Si vous définissez Range: bytes sur 500-2000, la fin de la plage n'est pas valide. Dans ce cas, OSS renvoie le code d'état HTTP 200 et l'intégralité de l'objet.

    • Si vous définissez Range: bytes sur 1000-2000, le début de la plage n'est pas valide. Dans ce cas, OSS renvoie le code d'état HTTP 200 et l'intégralité de l'objet.

  • Ajoutez l'en-tête x-oss-range-behavior:standard à la requête pour modifier le comportement de téléchargement lorsque la plage spécifiée n'est pas valide. Pour un objet d'une taille de 1 000 octets :

    • Si vous définissez Range: bytes sur 500-2000, la fin de la plage n'est pas valide. Dans ce cas, OSS renvoie le code d'état HTTP 206 et les données de l'octet 500 à l'octet 999.

    • Si vous définissez Range: bytes sur 1000-2000, le début de la plage n'est pas valide. Dans ce cas, OSS renvoie le code d'état HTTP 416 et le code d'erreur InvalidRange.

Exemple de code

Le code suivant montre comment ajouter l'en-tête de requête RangeBehavior:standard à une requête. Cet en-tête spécifie le comportement de téléchargement standard, qui télécharge les données du fichier dans la plage spécifiée.

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()

Références

  • Pour l'exemple de code complet concernant le téléchargement par plage, consultez get_object_range.py.