2013-06-21 9 views
1

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)

Répondre

1

Après googler autour un peu plus, j'ai trouvé le commentaire suivant sur cette page: http://doc.s3.amazonaws.com/proposals/post.html

<!-- The file must be the last meaningful element in the request; other elements after this will be ignored --> 

Basculer le champ de saisie caché Content-Type avant que le champ de saisie de fichier répare mon problème.

Questions connexes