2015-12-15 6 views
2

У меня есть следующий фрагмент кода:Aws :: S3 :: Ошибки :: BadDigest при попытке сохранить TempFile

tempfile = Tempfile.new(export_file.filename) 
begin 
    tempfile.write(contents) 
    file_storage_service.store(export_file.filename, tempfile) 
ensure 
    tempfile.close! 
end 

и метод store выглядит следующим образом:

def store(filename, file) 
    client = Aws::S3::Client.new(options) 
    object = Aws::S3::Object.new(bucket_name, filename, client: client) 
    object.upload_file(file) 
end 

Мой вопрос что я, кажется, получаю ошибку Aws::S3::Errors::BadDigest на одной из моих облачных машин, но локально работает, как ожидалось.

Я считаю, что временный файл отсоединен, когда вызывается метод store, в результате AWS сравнивает два разных дайджеста, но я не очень уверен в этом. У меня есть Ruby 2.1.6 на обеих машинах, на локальной - OS X и облачный Linux.

Что можно сделать, чтобы исправить это? И в чем причина проблемы?

P.S .: Я пробовал оба close! и close в tempfile с теми же результатами.

ответ

4

Кажется, что S3's upload_file ожидает файл с сбросом курсора. Вызов tempfile.rewind перед вызовом store решает эту проблему.

1

О, люди, моя проблема была еще глубже. С tempfile.rewind исчезла ошибка, но изменения, внесенные в файл непосредственно не были отражены в памяти, поэтому вместо того, чтобы использовать перемотку назад, я в конечном итоге с помощью:

tempfile.close 
tempfile.open 

Это полностью фиксированной моей проблемы!