J'ai une application rails qui télécharge avec succès les images de produits vers s3 en utilisant carrierwave et le brouillard suivant le tutoriel railscast. Maintenant j'essaye d'employer la gemme directe de Carrierwave pour télécharger le dossier directement à s3. Cela fonctionne également, sauf que le type de contenu a été défini comme binaire/octet-stream ce qui fait que les images invoquent un téléchargement de fichier dans le navigateur au lieu de simplement afficher le jpg.Problème de définition du type de contenu sur amazon s3 avec carrierwave direct
Donc, selon les instructions de pierres précieuses à https://github.com/dwilkie/carrierwave_direct, j'ai ajouté à config carrierwave:
config.will_include_content_type = true
et a ajouté un champ caché Content-Type avec la valeur de l'image/jpeg.
Le formulaire de téléchargement de fichier généré par l'assistant de forme semble être correct:
<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>
La base 64 politique codée est:
{"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]]}
qui semble correspondre à cet article ici: http://aws.amazon.com/articles/1434
Mais quand je le teste en local, j'obtiens cette réponse d'erreur dans le navigateur:
<Error>
<Code>AccessDenied</Code>
<Message>Invalid according to Policy: Policy Condition failed:
["starts-with", "$Content-Type", ""]</Message>
...
</Error>
Je ne sais pas vraiment ce que cela signifie. J'ai recherché sur google cette erreur et trouvé ce problème: https://github.com/dwilkie/carrierwave_direct/issues/63
Mais la solution n'est pas utile. Est-ce que je manque quelque chose?
J'utilise:
carrierwave (0.8.0) ActiveModel (> = 3.2.0) activesupport (> = 3.2.0) carrierwave_direct (0.0.12)
rails (3.2.13)