5

私はこの世界にかなり慣れていないので、これはここでの最初の質問です! 私はこれを自分で理解しようと数日を費やしましたが、これまでのところ有用な情報を見つけることができませんでした.

次のようなものを使用して、S3 に保存されているファイルからバイト範囲を取得しようとしています。

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

復元しようとしているファイルはビデオ ファイル、具体的には MXF です。バイト範囲を要求すると、要求されたよりも多くの情報が一時ファイルに返されます。たとえば、1 つのファイルを使用して 100,000 バイトを要求すると、100,451 が返されます。

MXF ファイルについて注意すべきことの 1 つは、これらのファイルには正当に 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 00 3B 0D 0A 06 0E 2B 34 01 01 01 05

コードをデバッグして、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)

特定の ASCII エスケープ文字を探して変更している Boto コードに何かがあると思いますが、それをバイナリ ファイルとして扱うように指定する方法が見つかりません。

誰かが同様の問題を抱えていて、それを回避する方法を共有できますか?

ありがとう

ティム

4

1 に答える 1

2

出力ファイルをバイナリ ファイルとして開きます。それ以外の場合、そのファイルに書き込むと、LF が CR/LF に自動的に変換されます。

tempfile = open(tempFilePath, 'wb')

もちろん、これは Windows システムでのみ必要です。Unix は、ファイルがテキスト ファイルとして開かれたか、バイナリ ファイルとして開かれたかに関係なく、何も変換しません。

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

于 2013-05-28T10:01:42.713 に答える