2016-04-30 3 views
3

Для начала я использую 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> 

ответ

1

Я просто была очень похожая проблема, и я думаю, что я решил. Надеюсь, это поможет.

Я понял, что установка content_type_starts_with фактически не ограничивает загрузку какого-либо файла, но ограничивает то, что на самом деле имеет ключ content-type в ваших данных формы, но вам все равно нужно будет установить тип содержимого, собираюсь опубликовать.

Поскольку я делаю на стороне клиента загрузки с JavaScript, я просто добавил это мой код загрузки: formData.set('content-type', file.type) где formData является экземпляром FormData объекта, который я в конечном счете отправить на сервер через XMLHttpRequest.

После этого загрузка pdf начнется с загрузки, но не сохранит файл на S3, поскольку ограничение типа MIME.

Дайте мне знать, если вам нужна дополнительная информация, я основываю код моего кода для загрузки: http://blog.teamtreehouse.com/uploading-files-ajax