2013-05-28 11 views
5

これは私がこの世界にはかなり新しいので、ここでの最初の質問です!私は数日間、自分自身でこれを理解しようと努力しましたが、それまで有用な情報を見つけることはできませんでした。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) 

を示しており、テストのためにこれを作成しましたバイナリファイルとして扱うように指定する方法です。

誰もが同様の問題を抱えていますが、その周りに道を共有することはできますか?

ティム

+0

どのbotoバージョンをお使いですか? 'boto .__ version__ ' – Alfe

+0

botoバージョン2.6を使用しています。0 –

+0

これは{'Range': 'bytes = 0-100000'}ビットに直接関係しないことを確認するために、get_contents_as_fileと: を使用してファイル全体をダウンロードしました。 要求されたバイト= 234630656 バイトが受信されました= 235363424 追加バイト= 732768 –

答えて

2

おかげで、バイナリファイルとして出力ファイルを開きます。そうしないと、そのファイルに書き込むとLFが自動的にCR/LFに変換されます。

tempfile = open(tempFilePath, 'wb') 

もちろん、Windowsシステムでのみ必要です。 Unixは、ファイルがテキストとして表示されるか、バイナリファイルとして表示されるかにかかわらず、何も変換しません。

あなたは、最初にS3にそのような破損したデータを取得しないようにアップロードするときも注意が必要です。

+0

おかげアルフェを使用して、それが単純で明白です。非常に高く評価! –

関連する問題