5

まず、ruby の aws-sdk を使用していますが、私が直面しているのは、S3 の署名付き投稿の誤解のようです。


私ができるようにしたいのは、署名付きの投稿で 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>
4

1 に答える 1

1

私は非常によく似た問題を抱えていたので、それを解決したと思います。これが役立つことを願っています。

を設定しても実際にアップロードされるファイルの種類は制限されませんが、フォーム データの実際content_type_starts_withのキーは制限されますが、フォームが投稿するコンテンツ タイプを設定する必要があることに気付きました。content-type

私は JavaScript を使用してクライアント側のアップロードを行っているので、これをアップロード コードに追加し formData.set('content-type', file.type)ましformDataFormData

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

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

于 2016-05-10T08:09:59.113 に答える