У меня есть приложение Rails, в котором каждый пользователь может загрузить аватар. Изображение загружается непосредственно на S3 Amazon с помощью HTTP Post. Пока все работает, за исключением того, что пользователь может загружать файлы любого типа.Прямая загрузка Amazon S3 не распознает тип содержимого файла
Я использую вилку плагина d2s3 от camelpunch. Вот помощники:
policy = Base64.encode64(
"{'expiration': '#{expiration_date}',
'conditions': [
{'bucket': '#{bucket}'},
['starts-with', '$key', '#{key}'],
{'acl': '#{acl}'},
{'success_action_redirect': '#{redirect}'},
['starts-with', '$Content-Type', '#{content_type}'],
['content-length-range', #{min_filesize}, #{max_filesize}]
]
}").gsub(/\n|\r/, '')
signature = b64_hmac_sha1(D2S3::S3Config.secret_access_key, policy)
out = ""
out << %(
<form action="https://#{bucket}.s3.amazonaws.com/" method="post" enctype="multipart/form-data" id="#{options[:form][:id]}" class="#{options[:form][:class]}">
<div>
<input type="hidden" name="key" value="#{key}/${filename}" />
<input type="hidden" name="AWSAccessKeyId" value="#{access_key_id}" />
<input type="hidden" name="acl" value="#{acl}" />
<input type="hidden" name="success_action_redirect" value="#{redirect}" />
<input type="hidden" name="policy" value="#{policy}" />
<input type="hidden" name="signature" value="#{signature}" />
<input type="hidden" name="Content-Type" value="#{content_type}" />
<input name="file" type="file" />#{submit_button}
</div>
</form>
)
У меня есть тип содержимого установлен на «изображение/JPEG», но Amazon, кажется, игнорирует это. В документах говорится, что он настраивается именно так. Я делаю что-то неправильно?
Кроме того, когда файл, размер которого превышает размер файла max, загружается, приложение просто ложится. S3 не отвечает сообщением об ошибке xml. Можно ли это исправить?
Спасибо!
Тим
Можете ли вы прояснить: пытаетесь ли вы выполнить проверку, установив тип содержимого? –