2016-04-30 15 views
3

首先,我使用的是ruby的aws-sdk,但我所面對的似乎是對S3的預定帖子的誤解。S3 Presigned Post需要特定的內容類型


我想要做的就是確保上傳到S3的任何內容都是我的預先登記帖子是視頻。

我試過的是在presigned_post哈希值中設置content_type_starts_with: "video/"。這會導致所有上傳被拒絕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)其中formDataFormData對象,我最終通過一個XMLHttpRequest發送到服務器的實例。

做完這些之後,上載PDF文件將開始上傳,但不會保存S3上的文件,因爲MIME類型限制。

讓我知道如果您需要一些更多的信息,我基於我的一些我的上傳代碼:http://blog.teamtreehouse.com/uploading-files-ajax

相關問題