私はrubyのaws-sdkを使用していますが、私が直面していることはS3のpresigned投稿の誤解のようです。S3 Presigned Post特定のコンテンツタイプが必要
私ができることを望むことは、私の予約済み投稿で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
。
コンテンツタイプフィールドはどのように使用しますか?それは私がそれがしたいことをこれまでしていないようです。ここで
は、私が使用しているコードの抜粋です:
# 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>