亚马逊 S3 直接上传无法识别文件的内容类型

5
我已经设置了我的Rails应用程序,每个用户都可以上传头像。该图像直接通过HTTP Post上传到Amazon的S3。目前一切都正常,除了用户能够上传任何类型的文件。
我正在使用camelpunch的d2s3插件的分支。以下是帮助程序:
  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',但亚马逊似乎忽略了它。在文档中,它说要像这样设置。我做错了什么吗?
此外,当上传的文件大于设置的最大文件大小时,应用程序会停止响应。S3不会回复xml错误消息。这能修复吗?
谢谢!
蒂姆

请问您能否澄清一下:您是想通过设置内容类型来执行验证吗? - Pan Thomakos
2个回答

4
亚马逊无法确定文件的实际内容类型,因为这需要分析二进制数据。
亚马逊使用上传时声明的内容类型提供文件,因此该策略仅限制用户上传将以不允许的内容类型提供的文件。例如,没有人可以入侵您的表单并将某些内容作为“application/pdf”提供。但是,他们可以上传一个声称是“image/jpeg”的PDF文件,该文件将作为jpeg提供给消费者,导致图像损坏。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接