Cette rubrique explique comment utiliser la méthode UploadPartCopy du SDK OSS pour Python 2.0 afin de copier des parties d'un objet depuis un bucket source et de les assembler pour former un nouvel objet complet dans un bucket de destination. Les buckets source et de destination peuvent être identiques ou différents, mais ils doivent se trouver dans la même région.
Remarques sur l'utilisation
L'exemple de code présenté dans cette rubrique utilise l'ID de région
cn-hangzhoucorrespondant à 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 que le bucket, utilisez un endpoint interne. Pour plus d'informations sur les régions et les endpoints pris en charge par OSS, consultez la page Régions et endpoints.Pour copier un objet, vous devez disposer des autorisations de lecture sur l'objet source ainsi que des autorisations de lecture et d'écriture sur le bucket de destination.
Le bucket source et le bucket de destination doivent se trouver dans la même région. Par exemple, il est impossible de copier des objets d'un bucket situé dans la région Chine (Hangzhou) vers un bucket situé dans la région Chine (Qingdao).
Assurez-vous qu'aucune politique de rétention n'est configurée pour le bucket source ni pour le bucket de destination. Dans le cas contraire, le message d'erreur suivant s'affiche : The object you specified is immutable.
Méthode
upload_part_copy(request: UploadPartCopyRequest, **kwargs) → UploadPartCopyResult
Paramètres de requête
|
Paramètre |
Type |
Description |
|
request |
UploadPartCopyRequest |
Les paramètres de la requête. Pour plus d'informations, consultez la documentation relative à UploadPartCopyRequest |
Paramètres de réponse
|
Type |
Description |
|
UploadPartCopyResult |
La valeur de retour. Pour plus d'informations, consultez la documentation relative à UploadPartCopyResult |
Pour consulter la définition complète de la méthode de copie multipart, reportez-vous à la documentation de upload_part_copy.
Processus de copie multipart
Pour télécharger un fichier local via un téléchargement multipart, procédez comme suit :
-
Initiez une tâche de téléchargement multipart.
Utilisez la méthode client.initiate_multipart_upload pour obtenir un ID de téléchargement unique dans OSS.
-
Téléchargez les parties.
Utilisez la méthode client.upload_part_copy pour obtenir un ID de téléchargement unique dans OSS.
RemarquePour les parties téléchargées lors d'une tâche de téléchargement multipart associée à un ID de téléchargement spécifique, les numéros de partie identifient leur position relative au sein de l'objet. Si vous téléchargez une partie puis réutilisez son numéro de partie pour en télécharger une autre, la nouvelle partie écrase la partie d'origine.
OSS inclut le hachage MD5 des données de la partie dans l'en-tête ETag et renvoie ce hachage à l'utilisateur.
OSS calcule le hachage MD5 des parties téléchargées et le compare au hachage MD5 calculé à l'aide du SDK OSS pour Harmony. Si les deux hachages diffèrent, OSS renvoie le code d'erreur InvalidDigest.
-
Finalisez la tâche de téléchargement multipart.
Assemblez les parties téléchargées en un objet unique en utilisant la méthode client.complete_multipart_upload.
Exemple de code
L'exemple de code ci-dessous illustre la procédure de copie d'un objet d'un bucket source vers un bucket de destination via une copie multipart, ainsi que l'assemblage des parties en un objet complet :
import argparse
import alibabacloud_oss_v2 as oss
# Create a command line argument parser and describe the purpose of the script: synchronous multipart copy and upload sample
parser = argparse.ArgumentParser(description="upload part copy synchronously sample")
# Add the --region command line parameter, which indicates the region where the bucket is located. This parameter is required.
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
# Add the --bucket command line parameter, which indicates the name of the destination bucket to which the object is to be uploaded. This parameter is required.
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
# Add the --endpoint command line parameter, which indicates the domain name that other services can use to access OSS. This parameter is optional.
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
# Add the --key command line parameter, which indicates the key of the destination object in OSS. This parameter is required.
parser.add_argument('--key', help='The name of the object.', required=True)
# Add the --source_bucket command line parameter, which indicates the name of the bucket where the source object is located. This parameter is required.
parser.add_argument('--source_bucket', help='The name of the source bucket.', required=True)
# Add the --source_key command line parameter, which indicates the key of the source object in OSS. This parameter is required.
parser.add_argument('--source_key', help='The name of the source object.', required=True)
def main():
# Parse the parameters provided on the command line to obtain the values entered by the user.
args = parser.parse_args()
# Load the authentication information required to access OSS from environment variables for identity verification.
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Use the default configurations of the SDK to create a configuration object and set the authentication provider.
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
# If a custom endpoint is provided, update the endpoint property in the configuration object.
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# Use the preceding configurations to initialize the OSS client and prepare for interaction with OSS.
client = oss.Client(cfg)
# Obtain the metadata of the source object.
result_meta = client.get_object_meta(oss.GetObjectMetaRequest(
bucket=args.source_bucket,
key=args.source_key,
))
# Initialize a multipart upload request and return an upload ID to identify the process.
result = client.initiate_multipart_upload(oss.InitiateMultipartUploadRequest(
bucket=args.bucket,
key=args.key,
))
# Define the size of each part. In this example, the size is set to 1 MB.
part_size = 1024 * 1024
total_size = result_meta.content_length # The total size of the source file.
part_number = 1 # The part number starts from 1.
upload_parts = [] # Used to store the information of uploaded parts.
offset = 0 # The current byte offset.
# Loop until all data is uploaded.
while offset < total_size:
num_to_upload = min(part_size, total_size - offset) # Calculate the amount of data to be uploaded this time.
end = offset + num_to_upload - 1 # Determine the end position.
# Perform the actual multipart copy and upload operation.
up_result = client.upload_part_copy(oss.UploadPartCopyRequest(
bucket=args.bucket,
key=args.key,
upload_id=result.upload_id,
part_number=part_number,
source_bucket=args.source_bucket,
source_key=args.source_key,
source_range=f'bytes={offset}-{end}', # Specify the range in the source object.
))
# Print the status information of the uploaded part.
print(f'status code: {up_result.status_code},'
f' request id: {up_result.request_id},'
f' part number: {part_number},'
f' last modified: {up_result.last_modified},'
f' etag: {up_result.etag},'
f' source version id: {up_result.source_version_id}'
)
# Record the information of the successfully uploaded part.
upload_parts.append(oss.UploadPart(part_number=part_number, etag=up_result.etag))
offset += num_to_upload # Update the offset.
part_number += 1 # Update the part number.
# Sort all uploaded parts by part number.
parts = sorted(upload_parts, key=lambda p: p.part_number)
# Send a request to the OSS service to complete the multipart upload.
result = client.complete_multipart_upload(oss.CompleteMultipartUploadRequest(
bucket=args.bucket,
key=args.key,
upload_id=result.upload_id,
complete_multipart_upload=oss.CompleteMultipartUpload(
parts=parts
)
))
# Print the detailed results after the upload is complete.
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' bucket: {result.bucket},'
f' key: {result.key},'
f' location: {result.location},'
f' etag: {result.etag},'
f' encoding type: {result.encoding_type},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id}'
)
# When this script is directly executed, call the main function to start processing the logic.
if __name__ == "__main__":
main() # The entry point of the script. The program flow starts from here.
Référence
Pour consulter l'exemple de code complet relatif à la copie multipart, rendez-vous sur upload_part_copy.py.