これは私がこの世界にはかなり新しいので、ここでの最初の質問です!私は数日間、自分自身でこれを理解しようと努力しましたが、それまで有用な情報を見つけることはできませんでした。Boto「get byte range」が期待以上に返される
私のようなもの使用して、S3に格納されたファイルからバイト範囲を取得しようとしている:
S3Key.get_contents_to_file(tempfile, headers={'Range': 'bytes=0-100000'}
私はから復元しようとしているファイルは、特にMXFビデオファイルです。私がバイト範囲を要求するとき、私は要求よりもtempfileに多くの情報を返します。たとえば、1つのファイルを使用して、私は100,000バイトを要求し、100,451に戻ります。
MXFファイルについて注意すべきことは、正当に0x0A(ASCII改行)と0x0D(ASCIIキャリッジリターン)が含まれていることです。
私は周囲に掘り起こしていましたが、ファイルに0Dバイトが存在するときはいつでも、0Dの代わりに0A 0Dが追加され、必要以上の情報を取得するように見えます。
例として、元のファイルは、16進文字列が含まれます。
02 03 00 00 00 00 3B 0A 06 0E 2B 34 01 01 01 05
のが、ファイルダウンロード形態S3はあります
02 03 00 00 00 3B 0D 0A 06 0E 2B 34 01 01 01 05
私はコードをデバッグしようとしましたが、Botoロジックを使って作業しましたが、私は比較的新しいです非常に簡単に失われる。
私はそこに特定のASCIIエスケープ文字を探して、それらを変更している後のBotoコードで何かがある、と私はいずれかを見つけることができないと思い、問題
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)
を示しており、テストのためにこれを作成しましたバイナリファイルとして扱うように指定する方法です。
誰もが同様の問題を抱えていますが、その周りに道を共有することはできますか?
ティム
どのbotoバージョンをお使いですか? 'boto .__ version__ ' – Alfe
botoバージョン2.6を使用しています。0 –
これは{'Range': 'bytes = 0-100000'}ビットに直接関係しないことを確認するために、get_contents_as_fileと: を使用してファイル全体をダウンロードしました。 要求されたバイト= 234630656 バイトが受信されました= 235363424 追加バイト= 732768 –