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
Którą wersję Boto używasz? 'boto .__ version__' – Alfe
Używanie boto w wersji 2.6.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 –