2016-04-30 19 views
3

私はrubyのaws-sdkを使用していますが、私が直面していることはS3のpresigned投稿の誤解のようです。S3 Presigned Post特定のコンテンツタイプが必要


私ができることを望むことは、私の予約済み投稿で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

コンテンツタイプフィールドはどのように使用しますか?それは私がそれがしたいことをこれまでしていないようです。ここで


は、私が使用しているコードの抜粋です:

# 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は私が最終的にはXMLHttpRequestを介してサーバに送信FormDataオブジェクトのインスタンスです。

これを実行した後、pdfをアップロードするとアップロードが開始されますが、MIMEタイプの制限によりS3にファイルが保存されません。

さらに詳しい情報が必要な場合は、私のアップロードコードの一部に基づいてお知らせください:http://blog.teamtreehouse.com/uploading-files-ajax

関連する問題