2013-05-28 23 views
5

Buradaki ilk sorum, bu dünya için oldukça yeni olduğum için burada! Birkaç günümü kendim için çözmeye çalıştım ama şimdiye kadar hiç yararlı bir bilgi bulamadı.Boto "get byte range" değeri beklenenden daha fazla döner

ben gibi bir şey kullanarak, S3 saklanan bir dosyadan bir bayt aralığı almaya çalışıyorum:

S3Key.get_contents_to_file(tempfile, headers={'Range': 'bytes=0-100000'} 

ben den geri çalışıyorum dosya, spesifik olarak bir MXF video dosyasıdır. Bayt aralığı istediğimde, tempfile daha fazla bilgiyi geri istenir. Örneğin, bir dosya kullanarak 100.000 bayt talep ediyorum ve 100.451 dolar. MXF dosyaları hakkında nota

şeylerden biri insanların meşru 0x0A (ASCII satır besleme) ve 0x0D (ASCII satırbaşı) içermesidir.

Etrafımda bir kazı yaptım ve dosyada 0D bayt herhangi bir zaman bulunduğunda, alınan bilgi yalnızca 0D yerine 0A 0D ekler, bu nedenle gerekli olandan daha fazla bilgi almak için görünür.

Örnek olarak

, orijinal dosya Hex dizesini içerir:

02 03 00 00 00 00 3B 0A 06 0E 2B 34 01 01 01 05

Ama dosya indirilen formu S3 vardır:

02 03 00 00 00 00 3B 0D 0A 06 0E 2B 34 01 01 01 ben kod hata ayıklama ve Boto mantığı boyunca çalışabilir denedim, ama bu nispeten yeni olduğum

05, bu yüzden çok kolay kaybolmak.

ben konuyu gösteren test yaratmadın

from boto.s3.connection import S3Connection 
from boto.s3.connection import Location 
from boto.s3.key import Key 
import boto 
import os 


## AWS credentials 
AWS_ACCESS_KEY_ID = 'secret key' 
AWS_SECRET_ACCESS_KEY = 'access key' 

## Bucket name and path to file 
bucketName = 'bucket name' 
filePath = 'path/to/file.mxf' 

#Local temp file to download to 
tempFilePath = 'c:/tmp/tempfile' 


## Setup the S3 connection and create a Key to access the file specified 
## in filePath 
conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
bucket = conn.get_bucket(bucketName) 
S3Key = Key(bucket) 
S3Key.key = filePath 

def testRangeGet(bytesToRead=100000): # default read of 100K 
    tempfile = open(tempFilePath, 'w') 
    rangeString = 'bytes=0-' + str(bytesToRead -1) #create byte range as string 
    rangeDict = {'Range': rangeString} # add this to the dictionary 
    S3Key.get_contents_to_file(tempfile, headers=rangeDict) # using Boto 
    tempfile.close() 
    bytesRead = os.path.getsize(tempFilePath) 
    print 'Bytes requested = ' + str(bytesToRead) 
    print 'Bytes recieved = ' + str(bytesRead) 
    print 'Additional bytes = ' + str(bytesRead - bytesToRead) 

Belirli ASCII kaçış karakterleri için bakan ve değiştirerek edilir Boto kodunda şey olduğunu tahmin ve herhangi bulamıyorum Sadece bir ikili dosya olarak ele almak için belirleme yolu.

Benzer bir sorun yaşayan ve çevresinde bir yolu paylaşan var mı?

Teşekkür

Tim

+0

Hangi boto sürümünü kullanıyorsunuz? boto .__ version__' – Alfe

+0

Boto sürüm 2.6'yı kullanma.0 { –

+0

Sadece {'Range': 'bytes = 0-100000'} bit ile doğrudan ilgili olmadığından emin olmak için başka bir şey denedim, bu yüzden get_contents_as_file ile tüm dosyayı indirdikten sonra: Bytes talep edildi = 234630656 = 235363424 Ek bytes = 732768 –

cevap

2

bir ikili dosyası olarak çıktı dosyasını açın. Aksi takdirde, bu dosyaya yazmak LF'yi otomatik olarak CR/LF'ye dönüştürür.

tempfile = open(tempFilePath, 'wb') 

Bu, elbette sadece Windows sistemlerinde gereklidir. Bir dosyanın bir metin veya ikili dosya olarak açılıp açılmadığına bakılmaksızın, unix'ler hiçbir şeyi dönüştürmez. ilk etapta S3 bu tür benzeri bozuk veri almak kalmamasıdır yanı yüklerken

Sen dikkat etmelisiniz.

+0

Teşekkürler Alfe, birisi bunu gösterdiğinde basit ve açık . Çok müteşekkirim! –

İlgili konular