2

railscastチュートリアルに従って、carrierwaveとfogを使用して製品画像をs3に正常にアップロードするRailsアプリがあります。現在、Carrierwave direct gem を使用してファイルを直接 s3 にアップロードしようとしています。これも同様に機能しますが、コンテンツ タイプがバイナリ/オクテット ストリームとして設定されていることを除いて、画像は jpg を表示するだけでなく、ブラウザでファイルのダウンロードを呼び出します。

したがって、 https://github.com/dwilkie/carrierwave_directの gem の指示に従って、carrierwave の構成に追加しました。

config.will_include_content_type = true 

image/jpeg の値を持つ隠しフィールド Content-Type を追加しました。

フォーム ヘルパーによって生成されたファイル アップロード フォームは正しいようです。

  <form accept-charset="UTF-8" action="https://mybucket.s3.amazonaws.com/" class="new_product_image_uploader" enctype="multipart/form-data" id="new_product_image_uploader" method="post">
    <div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"></div>
    <input id="product_image_uploader_key" name="key" type="hidden" value="uploads/.../${filename}">
    <input id="product_image_uploader_aws_access_key_id" name="AWSAccessKeyId" type="hidden" value="...">
    <input id="product_image_uploader_acl" name="acl" type="hidden" value="public-read">
    <input id="product_image_uploader_success_action_redirect" name="success_action_redirect" type="hidden" value="http://localhost:5000/products">
    <input id="product_image_uploader_policy" name="policy" type="hidden" value="...">
    <input id="product_image_uploader_signature" name="signature" type="hidden" value="...">
    <input id="product_image_uploader_product_image" name="file" type="file">
    <input id="Content-Type" name="Content-Type" type="hidden" value="image/jpeg"><br>
    <input name="commit" type="submit" value="Create Product image uploader">
  </form>

Base 64 でエンコードされたポリシーは次のとおりです。

{"expiration":"2013-06-21T13:35:42Z","conditions":[["starts-with","$utf8",""],["starts-with","$key","uploads"],["starts-with","$Content-Type",""],{"bucket":"mybucket"},{"acl":"public-read"},{"success_action_redirect":"http://localhost:5000/products"},["content-length-range",1,5242880]]}

こちらの記事に対応しているようです: http://aws.amazon.com/articles/1434

しかし、ローカルでテストすると、ブラウザに次のエラー応答が表示されます。

<Error>
<Code>AccessDenied</Code>
<Message>Invalid according to Policy: Policy Condition failed: 
["starts-with", "$Content-Type", ""]</Message>
...
</Error>

それが何を意味するのかよくわかりません。このエラーをグーグルで検索したところ、この問題が見つかりました: https://github.com/dwilkie/carrierwave_direct/issues/63

しかし、解決策は役に立ちません。何か不足していますか?

私は使用しています:

キャリアウェーブ (0.8.0) アクティブモデル (>= 3.2.0) アクティブサポート (>= 3.2.0) キャリアウェーブ_ダイレクト (0.0.12)

レール (3.2.13)

4

1 に答える 1