Rails 5和Carrierwave没有上传docx

时间:2017-09-16 19:01:07

标签: ruby-on-rails ruby file-upload imagemagick carrierwave

我有一个Rails 5应用程序。我正在使用Carrierwave进行文件上传。我能够成功上传开发和生产环境,PDF,JPG,PNG。但是,doc,docx,xl​​s,xlsx不上传。我得到的错误信息是:

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

Upfile是我的数据库列的名称(代表上传文件)。

我将引导您完成我的设置以及我为解决此问题所采取的步骤:

我有这些宝石:

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

在我的CarrierWave上传器文件中,我打电话给:

include CarrierWave::RMagick
storage :fog

我可以上传pdf,png和jpg格式。

但是,当我上传docx文件时,收到此错误消息:

Upfile translation missing: en.errors.messages.rmagick_processing_error

要修复此错误消息,我添加此gem:

gem 'carrierwave-i18n'

添加此gem可以解决问题,但是当我尝试上传docx文件时,收到了不同的错误消息:

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

所以我继续调试这个错误。我认为可能我的ImageMagick库不完整,并且缺少允许我识别docx文件的委托。我通过运行来查看代表:

convert -list configure

终端然后告诉我:

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

根据我对代表的观察,我有阅读docx,doc,xlss,xls等所有必要的组件。(我相信xml是允许我读取docx文件的委托,它被解释为压缩文件XML?)。这是我的搜索结束的地方。请帮我从这里发现解决方案?

[发现答案]感谢Maruf,我找到了答案。我在我的PDF上传器文件中的代码是(原谅pdfuploader命名法 - 我计划仅将其用于pdf,但随后引入了Word和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

此问题的答案是删除版本缩略图代码块。我的印象是:拇指在图像上可选择调用,但它似乎在所有上传中运行。我早该知道! :/

1 个答案:

答案 0 :(得分:1)

如果您提供上传者文件的完整代码,则很容易找到问题所在。但是我认为你正在使用RMagick处理图像,比如在文件中调整大小,裁剪等,因为你已经包含了#34;包括CarrierWave :: RMagick&#34;。所以RMagick无法处理文档(doc,docx,xl​​s,xlsx)。如果您需要相同的字段来支持所有文件,那么您可以通过检查文件格式或扩展名来处理具有条件的图像,否则您可以使用另一个上传器来处理文档文件。