Прямая загрузка Amazon S3 не распознает тип содержимого файла - PullRequest
4 голосов
/ 19 октября 2010

У меня установлено приложение на Rails, где каждый пользователь может загрузить аватар.Изображение загружается непосредственно в Amazon S3 с помощью HTTP Post.Пока все работает, за исключением того, что пользователь может загружать файлы любого типа.

Я использую вилку плагина 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>
    )

Мой тип контента установлен на 'image / jpeg', но Amazon, похоже, игнорирует это.В документах сказано, чтобы настроить его так, как это.Я делаю что-то не так?

Кроме того, когда загружается файл, размер которого превышает заданный максимальный размер файла, приложение просто останавливается.S3 не отвечает с сообщением об ошибке xml.Можно ли это исправить?

Спасибо!

Тим

Ответы [ 2 ]

4 голосов
/ 08 марта 2011

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

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

0 голосов
/ 15 февраля 2011

Было бы проще использовать драгоценный камень AWS :: S3 http://amazon.rubyforge.org/ или драгоценный камень RightAWS RightScale https://github.com/rightscale/right_aws?

...