Um zu starten, verwende ich ruby's aws-sdk, aber was ich vorgehe scheint ein Missverständnis von S3's vorgebrachten Beiträge zu sein.S3 Presigned Post erfordert spezifischen Content-Type
Ich möchte in der Lage sein, sicherzustellen, dass alles, was mit meinem vorgesagten Beitrag in S3 hochgeladen wird, ein Video ist.
Was ich versucht habe, ist content_type_starts_with: "video/"
im presigned_post Hash zu setzen. Dies führt dazu, dass alle Uploads mit Policy Condition failed: ["starts-with", "$Content-Type", "video/"]
abgelehnt werden.
Ich versuchte dann nur content_type: "video/mp4"
, aber dies bewirkt, s3 zu ermöglichen, dass jede Datei hochgeladen wird, und dann einfach mit Content-Type: "video/mp4"
in den Metadaten.
Ich bemerkte dann, dass S3 die Datei als binary/octet-stream
markieren wird, wenn ich eine Datei ohne Continue-Type-Einschränkung hochladen. Also habe ich die erste Methode noch einmal versucht, diesmal aber mit content_type_starts_with: "binary/"
. Die gleichen Ergebnisse wie zuvor,..
Wie soll ich das Feld "Content-Type" verwenden? Es scheint nie zu tun, was ich will.
Hier ist ein Ausschnitt aus dem Code Ich verwende:
# 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>