2013-05-28 45 views
5

Đây là câu hỏi đầu tiên của tôi ở đây vì tôi khá mới mẻ với thế giới này! Tôi đã dành một vài ngày cố gắng để tìm ra điều này cho bản thân mình, nhưng cho đến nay đã không thể tìm thấy bất kỳ thông tin hữu ích.Boto "phạm vi byte" trả về nhiều hơn mong đợi

Tôi đang cố gắng để lấy một phạm vi byte từ một tập tin lưu trữ trong S3, sử dụng một cái gì đó như:

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

Các tập tin mà tôi đang cố gắng để khôi phục lại từ một tập tin video, đặc biệt là một MXF. Khi tôi yêu cầu một phạm vi byte, tôi nhận được thêm thông tin trong tempfile hơn yêu cầu. Ví dụ, sử dụng một tập tin, tôi yêu cầu 100.000 byte và lấy lại 100,451.

Một điều cần lưu ý về tệp MXF là chúng hợp pháp chứa 0x0A (nguồn cấp dữ liệu dòng ASCII) và 0x0D (trả về vận chuyển ASCII).

Tôi đã tìm hiểu và xuất hiện bất kỳ khi nào có byte 0D trong tệp, thông tin đã truy xuất sẽ thêm 0A 0D thay vì chỉ 0D, do đó xuất hiện để truy xuất thêm thông tin so với yêu cầu.

Như một ví dụ, tập tin gốc có chứa chuỗi hex:

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

Nhưng những tập tin tải về hình thức S3 có:

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

Tôi đã cố gắng gỡ lỗi mã và làm việc theo cách của tôi thông qua logic Boto, nhưng tôi tương đối mới ở đây, vì vậy bị lạc rất dễ dàng.

tôi tạo này để thử nghiệm, trong đó cho thấy vấn đề

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) 

Tôi đoán có cái gì đó trong mã Boto đó là tìm ra cho các ký tự ASCII thoát nhất định và sửa đổi chúng, và tôi không thể tìm thấy bất kỳ cách để chỉ định xử lý nó dưới dạng tệp nhị phân.

Có ai có vấn đề tương tự và có thể chia sẻ một cách xung quanh nó không?

Cảm ơn

Tim

+0

Bạn đang sử dụng phiên bản boto nào? 'boto .__ version__' – Alfe

+0

Sử dụng boto phiên bản 2.6.0 –

+0

Đã thử một thứ khác, chỉ để đảm bảo rằng nó không liên quan trực tiếp đến các bit {'Range': 'bytes = 0-100000'}, do đó hãy tải xuống toàn bộ tệp bằng cách sử dụng get_contents_as_file và: Số byte yêu cầu = 234630656 Số byte nhận được = 235363424 Các byte bổ sung = 732768 –

Trả lời

2

Mở tập tin đầu ra của bạn như một tập tin nhị phân. Nếu không, việc ghi vào tập tin đó sẽ tự động chuyển đổi LF thành CR/LF.

tempfile = open(tempFilePath, 'wb') 

Điều đó tất nhiên chỉ cần thiết trên hệ thống Windows. Unixes sẽ không chuyển đổi bất cứ điều gì, bất kể một tập tin đã được mở dưới dạng văn bản hay tệp nhị phân.

Bạn nên cẩn thận khi tải lên mà bạn không nhận dữ liệu bị hỏng như vậy vào S3 ở địa điểm đầu tiên.

+0

Cảm ơn Alfe, nó đơn giản và rõ ràng khi ai đó chỉ ra . Rất nhiều đánh giá cao! –