0
votes

Copier Azure Blob comme Blockblob de URL distante

J'utilise le Azure-SDK-for-Python blobclient code> start_copy_from_url code> Pour copier un fichier distant à mon stockage local.

Cependant, le fichier finit toujours comme un appendblob au lieu de blockblob. Je ne vois pas comment je peux forcer le bloc BlockType de destination à bloquer Blockblob. P>

connection_string = "connection string to my dest blob storage account"
container_name = "myContainerName"
dest_file_name = "myDestFile.csv"
remote_blob_url = "http://path/to/remote/blobfile.csv"

client = BlobServiceClient.from_connection_string(connection_string)
dest_blob = client.get_blob_client(container_name, dest_file_name)
dest_blob.start_copy_from_url(remote_blob_url)


0 commentaires

3 Réponses :


0
votes

Comme je sais qu'il n'y a pas de conversion directe entre types de blob. Pour ce faire, vous devez télécharger le blob et le récupérer comme blob de bloc.


0 commentaires

2
votes

Vous ne pouvez pas changer de type blob dès que vous le créez.Veuillez voir le Copie BLOB de l'URL REST API , No Types de blob Header.

Vous pouvez vous reporter à mon code pour créer Block Blob de APPEND BLOB : xxx

 Entrez la description de l'image ici


0 commentaires

2
votes

Voici ce que vous voulez faire à l'aide de la dernière version (V12) Selon à la documentation ,

La goutte source pour une opération de copie peut être une blob de bloc, une blob d'annexe, ou une pages blob. Si le blob de destination existe déjà, il doit être de la même type de blob que la goutte source. p> BlockQuote>

En ce moment maintenant, vous ne pouvez pas utiliser start_copy_from_url pour spécifier un type de blob. Toutefois, vous pouvez utiliser les API de copie synchrones pour le faire dans certains cas. P>

Par exemple, pour Bloc à la page BLOB, Créer la page de destination BLOB en premier et invoquer update_range_from_url code> sur le Destination, avec chaque morceau de 4 Mo de la source. p>

De même, dans votre cas, créez d'abord un blob de bloc vide et utilisez le Stage_block_from_url code> . P>

for step in range(....):
    ###
    blob.stage_block_from_url(...)
    ##do not commit it##
#outside the for loop
blob.commit_block_list([j for j in range(i+1)]) (#or i+2?)


8 commentaires

Je reçois l'erreur: le corps de la demande source pour la source de copie est trop volumineux et dépasse la limite maximale autorisée (100 Mo). Fyi le fichier est de 1,3 Go


Avez-vous essayé d'organiser des blocs avec 4 Mochs MB? Laissez-moi vérifier quelque chose.


docs.microsoft.com/fr- US / REST / API / STORNAGAGESVICES / ... Mettre le bloc d'URL télécharge un bloc d'inclusion future dans une blob de bloc. Un blob de bloc peut inclure un maximum de 50 000 blocs. Chaque bloc peut être une taille différente, jusqu'à un maximum de 100 Mo. La taille maximale d'un blob de bloc est donc légèrement supérieure à 4,75 tb (100 Mo x 50 000 blocs). Cela signifie que vous devez télécharger votre blob dans 100 Mo de morceaux si vous utilisez des API de copie synchrones


Regardez la modification


J'ai créé une boucle à itérer sur les blocs. J'ai un bug quelque part. Il montre un téléchargement de 1,3 Go, mais seulement 4,8 Mo finit par le stockage.


Voici le code mis à jour. Je ne veux pas changer la question initiale. GIST.GITUB.COM/BRIGLX/66B2C478AB531BF3D9FD123CAFAA967E


Vous voulez commettre tous les blocs à la fois. En boucle pour, juste mettre en scène les blocs et commettez-les tous immédiatement en dehors de la boucle. Regardez la modification


Échoue lorsque les blocs de mise en scène sont de plus de 100 Mo avant de les avoir commis.