2017-09-16 2 views
0

J'ai une application Rails 5. J'utilise Carrierwave pour les téléchargements de fichiers. Je suis en mesure de télécharger avec succès dans les environnements de développement et de production, PDF, JPG, PNG. Cependant, doc, docx, xls, xlsx ne sont pas téléchargés. Le message d'erreur que je reçois est:Rails 5 et Carrierwave ne télécharge pas docx

Upfile Failed to manipulate with rmagick, maybe it is not an image? 

Upfile est le nom de ma colonne de base de données (signifie UploadedFile).

Je vous guidera à travers ma configuration et les étapes que j'ai prises pour résoudre ce problème:

Je ces gemmes:

gem "rmagick" 
gem 'carrierwave', '~> 1.0' 
gem 'fog' 

Dans mon CarrierWave fichier Uploader, je l'appelle:

include CarrierWave::RMagick 
storage :fog 

Je peux télécharger les formats pdf, png et jpg.

Cependant, quand je télécharge un fichier .docx je reçois ce message d'erreur:

Upfile translation missing: en.errors.messages.rmagick_processing_error 

Pour résoudre ce message d'erreur, ajouter ce petit bijou:

gem 'carrierwave-i18n' 

L'ajout de ce petit bijou permet de résoudre le problème, mais quand j'essaye de télécharger un dossier de docx, je reçois un différent message d'erreur:

Upfile Failed to manipulate with rmagick, maybe it is not an image? 

Ainsi je procède à déboguer cette erreur. Je considère que peut-être ma bibliothèque ImageMagick est incomplète et manque un délégué qui me permet de reconnaître un fichier docx. Je regarde les délégués en exécutant:

convert -list configure 

Le terminal me montre alors:

DELEGATES  bzlib mpeg freetype gslib jng jpeg lcms lzma png ps tiff xml zlib 

D'après ce que je vois avec les délégués, j'ai tous les composants nécessaires pour lire docx, doc, xlss, xls, etc. (Je crois que xml est le délégué qui me permet de lire un fichier docx, qui est interprété comme xml compressé?). C'est là que ma recherche se termine. S'il vous plaît aidez-moi à découvrir la solution d'ici?


[Réponse Trouvé] Merci à Maruf, j'ai été en mesure de trouver la réponse. Le code que j'avais dans mon fichier PDF Uploader est (pardonnez la nomenclature pdfuploader - je comptais l'utiliser uniquement pour pdfs mais ont été introduits formats Word et Excel):

class PdfUploader < CarrierWave::Uploader::Base 

    include CarrierWave::RMagick 

    storage :fog 

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

    version :thumb do 
    process resize_to_fit: [200, 200] 
    end 

    def extension_whitelist 
    %w(pdf doc html docx jpg jpeg gif png txt mp3 xls xlsx) 
    end 

end 

La réponse à cette question a été la suppression de la bloc de code de version de pouce. J'avais l'impression que: thumb a été appelé optionnellement sur les images, mais il semble qu'il a fonctionné sur tous les téléchargements. J'aurais dû savoir! :/

Répondre

1

Si vous donnez le code complet du fichier uploader, il sera facile de trouver le problème. Mais je pense que vous êtes en train de traiter une image comme le redimensionnement, le rognage, etc. dans ce fichier en utilisant RMagick car vous avez inclus "include CarrierWave :: RMagick". RMagick ne peut donc pas traiter les documents (doc, docx, xls, xlsx). Si vous avez besoin du même champ pour prendre en charge tous les fichiers, vous pouvez traiter les images avec condition en vérifiant le format de fichier ou l'extension, sinon vous pouvez utiliser un autre téléchargeur pour les fichiers de document.

+0

Maruf! Tu as complètement raison. J'ai eu le code suivant: version: thumb do ... processus resize_to_fit: [200, 200] .. end (pardonnez le format pseudocode/sloppy). Cela créait le problème. Mes fichiers docx et xlsx sont maintenant téléchargés. Je vous remercie! –