2013-04-30 6 views
2

Je travaille sur une application rails pour laquelle j'utilise carrierwave avec stockage de brouillard. J'ai un couple de champs dans mon formulaire où les utilisateurs peuvent soumettre une application son (Nom, courte & longue description, champ d'image). Le nom du fichier téléchargé est obtenu à partir du champ Nom dans le champ "Nom" de mon formulaire. Par exemple, lorsque je télécharge un fichier portant le nom Notepad, tout fonctionne correctement et l'image s'affiche sur ma page d'applications. Toutefois, lorsque je télécharge une image portant le nom Notepad++ dans le champ de formulaire, elle est transférée avec succès sur Amazon, mais une image est brisée. Afficher sa source et essayer d'ouvrir son URL produit une erreurAccès Amazon S3 Refus lors de la lecture des fichiers de seau S3 avec le signe "+"

<Error> 
    <Code>AccessDenied</Code> 
    <Message>Access Denied</Message> 
    <RequestId>0DBACCF4C0301B02</RequestId> 
    <HostId> 
     raYVzr9xubG0NA/b57saIJzfc2YhnvhD0tafYmo34ewOBY6/0j1AKUFC/lEoY+6h 
    </HostId> 
</Error> 

Cela se produit pour tous les noms avec le signe plus. Quel pourrait être le problème. J'ai essayé tout ce que je pouvais mais rien. Ceci est ma classe image_uploader

# encoding: utf-8 

class ImageUploader < CarrierWave::Uploader::Base 

    include CarrierWave::RMagick 

    storage :fog 

    include CarrierWave::MimeTypes 
    process :set_content_type 

    def store_dir 
     "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.name.to_s.downcase.underscore || model.id.to_s.underscore.downcase}" 
    end 

    def filename 
     "#{model.name.to_s.underscore.downcase}-#{secure_token}" if original_filename.present? 
    end 

    def default_url 
     "fallback/#{model.class.to_s.underscore}/" + [version_name, "noimage.gif"].compact.join('_') 
    end 

    version :nano_thumb do 
     process :resize_to_fill => [20, 20] 
    end 

    version :mini_thumb do 
     process :resize_to_fill => [25, 25] 
    end 

    version :small_thumb do 
     process :resize_to_fill => [34, 34] 
    end 

    version :thumb do 
     process :resize_to_fill => [48, 48] 
    end 

    version :small do 
     process :resize_to_fill => [86, 86] 
    end 

    version :medium do 
     process :resize_to_fill => [259, 259] 
    end 

    version :large do 
     process :resize_to_fill => [518, 518] 
    end 

    def extension_white_list 
     ["jpg", "jpeg", "gif", "png", ""] 
    end 

    protected 
    def secure_token(length=9) 
     var = :"@#{mounted_as}_secure_token" 
     model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2)) 
    end 

    end 

Merci de

Répondre

2

Très probablement, vous codez de manière incorrecte URL, comme un signe « + » doit être URL codé en premier.

Je vous recommande d'exécuter une sorte d'outil d'analyse de trafic (Wireshark par exemple) et de voir quel type de trafic envoyez-vous au serveur Amazon S3.

J'espère que ça aide!

+0

remercie en fait la gem 'carrierwave' qui ne code pas correctement les caractères correctement. –

3

Ceci est un problème connu dans carrierwave qui a été corrigé sur master mais qui n'a pas encore été publié. Vos options sont les suivantes:

  1. Utilisez masterwave master à la place de la version officielle.

  2. Mettez à jour le sanitize_regexp pour exclure les caractères +.

    CarrierWave :: SanitizedFile.sanitize_regexp = /[^a-zA-Z0-9.-_]/

Nouveaux téléchargements travailleront avec l'un de ceux-ci, mais vous aurez encore à fixer les anciens manuellement (creusez via s3 pour trouver le bon nom de fichier, puis mettez à jour votre base de données). Ou simplement les supprimer.

+0

Merci beaucoup pour la perspicacité. Cela m'a vraiment aidé –