2013-06-01 4 views
7

Репутация Сообщений: Amazon S3 & Checksum, How to encode md5 sum into base64 in BASHКак программно получить контрольную сумму MD5 Amazon S3 файл, используя Boto

я должен загрузить файл из дегтя S3 ведро с ограниченным доступом. [Главным образом права доступа предоставляются только для загрузки]

после загрузки я должен проверить контрольную сумму MD5 загруженного файла против MD5-Check Sum данных, присутствующих в качестве метаданных в S3

Я сейчас использую S3, чтобы вручную отметить «x-amz-meta-md5» заголовка содержимого и проверить это значение по сравнению с вычисленным md5 загруженного файла.

Я хотел бы знать, существует ли программный способ использования boto для захвата значения хеша md5 файла S3, как указано в метаданных.

from boto.s3.connection import S3Connection 

conn = S3Connection(access_key, secret_key) 
bucket=conn.get_bucket("test-bucket") 
rs_keys = bucket.get_all_keys() 
for key_val in rs_keys: 
    print key_val, key_val.**HOW_TO_GET_MD5_FROM_METADATA(?)** 

Пожалуйста, исправьте, если мое понимание неверно. Я ищу способ, чтобы захватить данные заголовка программно

ответ

9

Когда бото загружает файл, используя любой из get_contents_to_* методов, он вычисляет контрольную сумму MD5 байтов он загружает и делает, что доступно в качестве атрибута Key объекта md5 , Кроме того, S3 отправляет заголовок ETag в ответ, который представляет идею сервера о контрольной сумме MD5. Это доступно как атрибут etag объекта Key. Итак, после загрузки файла вы можете просто сравнить значение этих двух атрибутов, чтобы увидеть, соответствуют ли они.

Если вы хотите узнать, что думает S3 MD5-это фактически не загружая файл (как показано в вашем примере), вы можете просто сделать это:

for key_val in rs_keys: 
    print key_val, key_val.etag 
+2

Спасибо за предложение. Значение Etag, похоже, не совпадает с контрольной суммой Computed MD5. Я также видел в упомянутых сообщениях, что etag не является подходящим значением MD5. «x-amz-meta-md5» является ключом в моем браузере файлов S3, который дает мне значение MD5. Но этот ключ недоступен в метаданных или заголовках контента, которые должны быть получены программно. – user1652054

+3

Атрибут '' etag'' будет иметь форму '' "797cc49509a9df16481fac4fae144e0a" '', тогда как атрибут '' md5'' будет '' 797cc49509a9df16481fac4fae144e0a''. Обратите внимание на заключенные двойные кавычки в '' etag''. Это необходимо учитывать при сравнении значений. Ключ '' x-amz-meta-md5'' не является стандартным значением метаданных S3, а является обычным. Возможно, это было добавлено в браузер S3 File? – garnaat

+5

Еще один комментарий. Я просмотрел исходный код boto и подтвердил, что boto автоматически проверяет значение заголовка '' etag'' с вычисленным '' md5'' при загрузке файла. Он будет вызывать исключение 'S3DataError'', если они не совпадают. – garnaat

6

Кажется, хорошо известно, что ETag не md5sum, если файл был собран после запуска многокомпонентной загрузки. Я думаю, что в этом случае единственное средство - загрузить файл и выполнить контрольную сумму локально. Если результат верен, копия S3 должна быть хорошей. Если локальная контрольная сумма ошибочна, копия s3 может быть плохой или загрузка может быть неудачной. Если у вас больше нет исходного файла или записи его md5sum, я думаю, вам не повезло. Было бы замечательно, если бы md5sum собранного файла был доступен, или если бы был способ локально вычислить ожидаемый etag файла, который будет загружен через multipart.

Смежные вопросы