Для начала я использую aws-sdk от ruby, но то, с чем я сталкиваюсь, похоже, является непониманием назначенных должностей S3.S3 Presigned Post требует определенного Content-Type
Что я хочу, чтобы убедиться, что все, что загружено на 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>