2016-03-25 14 views
1

İş akışımın S3'ten indirilen bir tar dosyası var, genişletilmiş, ardından isteğe bağlı olarak bir buzul kasasına yüklemek istiyorum. S3 grubundaki başka dosyalar olduğu için, yaşam döngüsü yönetimini kullanmak istemiyorum. Boto altında çalışıyorum ve şimdi yavaş yavaş boto3boto3 glacier dosyasına bir dize yükleme

'a geçiyorum. Bir disk üzerine dosya indirmekten ziyade bir string nesnesine indirip indirebileceğimi keşfettim. diske dokunmam gerekmediğinden daha hızlı.

glacier = boto3.client('glacier', region_name='MYREGION') 
archive = glacier.upload_archive(vaultName='MYVAULT', archiveDescription=filename, body=response['Body'].read()) 

Ve bu beni fileler:

botocore.exceptions.ClientError: An error occurred (InvalidParameterValueException) when calling the UploadArchive operation: Invalid Content-Length: 0 

Herhangi bir düşünce

s3 = boto3.client('s3') 
response = s3.get_object(Bucket=bucket,Key=path) 
my_file = tarfile.open(fileobj=(StringIO(response['Body'].read()))) 
my_file.extractall(path="EXTRACTPATH") 

Ben boto3 aracılığıyla buzul yüklemek istiyorsanız, burada ne var?

+0

Aynı gövdeyi iki kez mi okuyorsunuz? Bir “StreamingBody” bir soketten akar ve böylece sadece bir kez okunabilir. –

+0

İyi çağrı. Sonuçları “response ['Body']. Read()' dosyasından sakladım ve daha sonra iki yerde kullandım ve işe yarayacak gibi görünüyor. Bir cevap ver. – mkomarinski

cevap

1

StreamingBody, aranmayan bir akıştır, doğrudan yuvadan okur, böylece yalnızca bir tane read alırsınız. Birden fazla konumda kullanmak istiyorsanız baytları kaydetmeniz gerekir.

İlgili konular