2013-05-28 8 views
5

To jest moje pierwsze pytanie, ponieważ jestem całkiem nowy na tym świecie! Spędziłem kilka dni próbując to zrozumieć, ale nie udało mi się znaleźć żadnych przydatnych informacji.Boto "get byte range" zwraca więcej niż oczekiwano

Próbuję pobrać zakres bajtów z pliku zapisanego w S3, używając coś takiego:

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

Plik że próbuję przywrócić z jest plik wideo, konkretnie MXF. Kiedy żądam zakresu bajtów, otrzymuję więcej informacji w pliku tymczasowym niż jest to wymagane. Na przykład, używając jednego pliku, żądam 100 000 bajtów i wracam 100,451.

Jedną z rzeczy wartych odnotowania na temat plików MXF jest to, że zgodnie z prawem zawierają one kod 0x0A (wiersz ASCII) i 0x0D (znak powrotu karetki ASCII).

Miałem wykopać i wydaje się, że za każdym razem, gdy w pliku znajduje się bajt 0D, pobrane informacje dodają 0A 0D zamiast tylko 0D, dlatego pojawiają się, aby pobrać więcej informacji niż jest to wymagane.

Jako przykład, oryginalny plik zawiera ciąg szesnastkowy:

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

ale plik pobrać formularz S3 posiada:

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

próbowałem do debugowania kodu i pracować moją drogę przez logikę Boto, ale jestem stosunkowo nowy na tym, więc bardzo łatwo się zgubić.

stworzyłem to do badań, które pokazuje WYDANIE

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) 

Chyba coś jest nie w kodzie Boto że szuka się dla niektórych znaków ASCII ewakuacyjnych i ich modyfikowanie, i nie mogę znaleźć żadnego sposób określić, aby traktować go jako plik binarny.

Czy ktoś miał podobny problem i mógł się nim podzielić?

Dzięki

Tim

+0

Którą wersję Boto używasz? 'boto .__ version__' – Alfe

+0

Używanie boto w wersji 2.6.0 –

+0

Wypróbowałem coś innego, aby upewnić się, że nie jest ono bezpośrednio związane z bitami {'Zakresy:: bajty = 0-100000'}, więc pobrałem cały plik za pomocą get_contents_as_file i: Żądane Bajty = 234630656 Otrzymano bajty = 235363424 Dodatkowe bajty = 732768 –

Odpowiedz

2

Otwórz plik wyjściowy w postaci pliku binarnego. W przeciwnym razie zapisanie do tego pliku automatycznie zamieni LF na CR/LF.

tempfile = open(tempFilePath, 'wb') 

Oczywiście jest to konieczne tylko w systemach Windows. Unixy niczego nie konwertują, niezależnie od tego, czy plik został otwarty jako tekst czy jako plik binarny.

Należy zachować ostrożność podczas przesyłania, a także, aby nie otrzymywać takich samych uszkodzonych danych do S3 w pierwszej kolejności.

+0

Dzięki Alfe, to proste i oczywiste, gdy ktoś wskazuje to . Bardzo doceniane! –

Powiązane problemy