S3预签名帖子需要特定的内容类型

Bri*_*ker 5 ruby amazon-s3 amazon-web-services pre-signed-url

首先,我使用的是ruby的aws-sdk,但是我面对的似乎是对S3的预贴帖子的误解。


我想要做的是确保通过我的预贴帖子上传到S3的所有内容都是视频。

我尝试做的是content_type_starts_with: "video/"在presigned_post哈希中设置。这会导致所有上载被拒绝Policy Condition failed: ["starts-with", "$Content-Type", "video/"]

然后content_type: "video/mp4",我尝试了,但是这导致s3允许任何文件上传,然后仅Content-Type: "video/mp4"在元数据中对其进行标记。

然后我注意到,当我上传没有Content-Type约束的文件时,S3会将文件标记为binary/octet-stream。因此,我再次尝试了第一种方法,但是这次使用content_type_starts_with: "binary/"。结果与之前相同Policy Condition Failed

我应该如何使用Content-Type字段?它似乎从未做过我想要做的事情。


这是我正在使用的代码的片段:

# In the controller

client = Aws::S3::Client.new(region: 'us-east-1')
resource = Aws::S3::Resource.new(client: client)
bucket = resource.bucket("my-bucket")

object_id = SecureRandom.uuid
object = bucket.object(object_id)

@presigned_post = object.presigned_post({
  acl: "private",
  content_length_range: 0..104857600, # 100 MB
  content_type_starts_with: "video/",
})

# In the presigned post erb

<form action="<%= presigned_post.url %>" method="post" enctype="multipart/form-data">
<% presigned_post.fields.each do |name, value| %>
    <input type="hidden" name="<%= name %>" value="<%= value %>"/>
<% end %>
    <input type="file" name="file" accept="*.mp4,*.ogg,video/*" />
    <input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

Thy*_*yme 3

我刚刚遇到了一个非常相似的问题,我想我已经解决了。我希望这有帮助。

我意识到设置content_type_starts_with实际上并不限制上传的文件类型,但它限制了content-type表单数据中的键实际上是什么,但您仍然需要设置表单要发布的内容类型。

由于我正在使用 JavaScript 进行客户端上传,因此我只是将其添加到我的上传代码中: formData.set('content-type', file.type)where formDatais an instance of aFormData是我最终通过 XMLHttpRequest 发送到服务器的对象

执行此操作后,上传 pdf 将开始上传,但由于 MIME 类型限制,不会将文件保存在 S3 上。

如果您需要更多信息,请告诉我,我基于此上传代码: http: //blog.teamtreehouse.com/uploading-files-ajax