2016-04-30 4 views
3

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> 

Antwort

1

Ich hatte gerade ein sehr ähnliches Problem, und ich denke, dass ich es gelöst. Ich hoffe das hilft.

Ich erkennen, dass die content_type_starts_with Einstellung beschränkt nicht wirklich, welche Art von Datei hochgeladen, aber es schränkt, was die content-type Schlüssel in Ihren Formulardaten tatsächlich ist, aber Sie werden immer noch den Inhaltstyp festlegen müssen, dass die Form zum Posten gehen.

Da ich eine clientseitige Upload mit JavaScript zu tun, habe ich nur noch die meinen Upload-Code: formData.set('content-type', file.type) wo formData ist eine Instanz eines FormData Objekt, das ich schließlich zum Server über einen XMLHttpRequest senden.

Danach wird beim Hochladen einer PDF-Datei der Upload gestartet, die Datei wird jedoch nicht auf S3 gespeichert, da die Einschränkung des MIME-Typs vorliegt.

Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen, basierte ich einige meiner Upload-Code von diesem: http://blog.teamtreehouse.com/uploading-files-ajax