4

У меня есть приложение 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. Можно ли это исправить?

Спасибо!

Тим

+0

Можете ли вы прояснить: пытаетесь ли вы выполнить проверку, установив тип содержимого? –

ответ

4

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

Amazon предлагает файлы с типом контента, заявленные при загрузке, поэтому политика ограничивает пользователей загрузкой файлов, которые будут обслуживаться с запрещенным типом контента. Например, никто не может взломать вашу форму и что-то послужило «application/pdf». Тем не менее, они могут загружать PDF-файл, заявляя, что это «образ/jpeg», который будет передаваться пользователям как jpeg, что приведет к сломанному изображению.

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