2017-02-17 29 views
0

Я использую многостраничную загрузку для определенного большого объекта/файла. Это прекрасно работает с использованием этой темы (https://github.com/boto/boto3/issues/50). Но когда я пытаюсь перечислить детали используя list_parts команду в Бото (проверить некоторые моменты) он дает мне ошибку:список деталей в многостраничной загрузке с использованием boto3 с python

вот код:

import os 
import json 
import sys 
import boto3 
from boto3 import client 
from botocore.utils import fix_s3_host 

def listbucketandobjects() : 
    with open("credentials.json", 'r') as f: 
     data = json.loads(f.read()) 
     bucket_target = data["aws"]["targetBucket"] 
     s3ressource = client(
      service_name='s3', 
      endpoint_url= data["aws"]["hostEndPoint"], 
      aws_access_key_id= data["aws"]["idKey"], 
      aws_secret_access_key=data["aws"]["secretKey"], 
      use_ssl=True, 
      )   
     key = 'mp-test.txt' 
     # Initiate the multipart upload and send the part(s) 
     mpu = s3ressource.create_multipart_upload(Bucket=bucket_target, Key=key)   
     part1 = s3ressource.upload_part(Bucket=bucket_target, Key=key, PartNumber=1, 
           UploadId=mpu['UploadId'], Body='Hello, world!') 
     # Next, we need to gather information about each part to complete 
     # the upload. Needed are the part number and ETag. 

     part_info = { 
      'Parts': [ 
       { 
        'PartNumber': 1, 
        'ETag': part1['ETag'] 
       } 
      ] 
     } 
     # Now the upload works! 
     s3ressource.complete_multipart_upload(Bucket=bucket_target, Key=key, UploadId=mpu['UploadId'], 
             MultipartUpload=part_info) 

     for item in mpu['UploadId']: 
      print (item)   

     for item in s3ressource.list_parts(Bucket=bucket_target,Key=key, UploadId=mpu['UploadId']): 
      print(item) 

listpartsobjects() 

здесь ошибка:

for item in s3ressource.list_parts(Bucket=bucket_target,Key=key, UploadId=mpu['UploadId']): 
File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 253, in _api_call 
return self._make_api_call(operation_name, kwargs) 
File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 543, in _make_api_call 
raise error_class(parsed_response, operation_name) 
botocore.errorfactory.NoSuchKey: An error occurred (NoSuchKey) when calling the ListParts operation: The specified key does not exist. 

Но при проверке страницы aws здесь (http://boto3.readthedocs.io/en/latest/reference/services/s3.html?highlight=list%20object) Я думаю, что чего-то не хватает. Но я не вижу, что ..

+0

Что вы надеялись увидеть? Мое подозрение в том, что «части» исчезают после завершения многостраничной загрузки, потому что они объединены в конечный объект. Попробуйте запустить команду 'list_parts()', прежде чем завершить загрузку, и, вероятно, отобразит то, что вы хотите. –

+0

@ Джон Ротенштейн: Это сработало. Я хотел сделать двойную проверку целостности ... – MouIdri

ответ

1

Благодаря Джону Ротенштейну, это сработало, ниже - уродливое (я знаю, но это до очистки) часть кода, которая создает составные части, а затем заполняет их.

def listbucketandobjects() : 
    with open("credentials.json", 'r') as f: 
     data = json.loads(f.read()) 
     bucket_target = data["aws"]["targetBucket"] 
     s3ressource = client(
      service_name='s3', 
      endpoint_url= data["aws"]["hostEndPoint"], 
      aws_access_key_id= data["aws"]["idKey"], 
      aws_secret_access_key=data["aws"]["secretKey"], 
      use_ssl=True, 
      ) 

     key = 'mp-test.txt' 
     mpu = s3ressource.create_multipart_upload(Bucket=bucket_target, Key=key) 
     part1 = s3ressource.upload_part(Bucket=bucket_target, Key=key, PartNumber=1, 
           UploadId=mpu['UploadId'], Body='Hello, world!') 
     # Next, we need to gather information about each part to complete 
     # the upload. Needed are the part number and ETag. 
     part_info = { 
      'Parts': [ 
       { 
        'PartNumber': 1, 
        'ETag': part1['ETag'] 
       } 
      ] 
     } 
     IDofUploadedMPU=mpu['UploadId'] 
     print ('**********************PRINT THE ULPOAD ID **********************') 
     print IDofUploadedMPU 
     print ('**********************PRINT THE COMPLETE LIST PARTS **********************') 
     jacko=s3ressource.list_parts(Bucket=bucket_target,Key=key,UploadId=IDofUploadedMPU) 
     print (jacko) 
     print ('**********************PRINT THE RECURSIVE COMPLETE LIST PARTS **********************') 
     for jack in s3ressource.list_parts(Bucket=bucket_target,Key=key, UploadId=IDofUploadedMPU)["Parts"]: 
      print(jack) 
     print ('********************** NOW UPLOADING **********************') 
     s3ressource.complete_multipart_upload(Bucket=bucket_target, Key=key, UploadId=mpu['UploadId'], 
             MultipartUpload=part_info) 

listbucketandobjects()