【问题标题】:Rails and carrierwave - images can be uploaded but pdf's can'tRails 和carrierwave - 可以上传图片,但不能上传pdf
【发布时间】:2013-12-15 22:11:29
【问题描述】:

我已成功使用载波上传图片文件。我希望表单能够接受图像文件和 pdf。当我尝试上传 pdf 时,它不会上传文件。它与这条线有关:

process :resize_to_fill => [166,166]

如果我把它拿出来,pdf 的工作。问题是我需要那条线,因为我需要调整所有上传的图片大小。 这是上传者:

class PortfoliofileUploader < CarrierWave::Uploader::Base
      include CarrierWave::MiniMagick
      def store_dir
          "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end
      version :picture do
           process :resize_to_fill => [166,166]
      end
      def extension_white_list
          %w(jpg jpeg gif png pdf doc docx)
      end
end

有谁知道我可以如何修复它以便图像和 pdf 可以正常工作?谢谢。

更新:

作品集展示页面(2 个版本):

版本 1:

<% @portfolio.portfolio_pics.collect{|picture| picture.port_pic.picture}.each do |pic| %>                           
    <li><a href="#"><%= image_tag pic %></a></li>                       
<% end %>

版本 2:

<% @portfolio.portfolio_pics.each do |pic| %>
    <li><a href="#"><%= image_tag pic.port_pic.picture %></a></li>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby imagemagick carrierwave minimagick


    【解决方案1】:

    Carrierwave 对此有一个解决方案,在 Readme 中指出:

    有条件的版本

    有时您想限制在模型中的某些属性上或基于图片本身创建版本。

    class MyUploader < CarrierWave::Uploader::Base
    
      version :human, :if => :is_human?
      version :monkey, :if => :is_monkey?
      version :banner, :if => :is_landscape?
    
    protected
    
      def is_human? picture
        model.can_program?(:ruby)
      end
    
      def is_monkey? picture
        model.favorite_food == 'banana'
      end
    
      def is_landscape? picture
        image = MiniMagick::Image.open(picture.path)
        image[:width] > image[:height]
      end
    
    end
    

    示例

    例如,为了只为图片创建缩略图,我采用了这个选项:

    version :thumb, :if => :image? do
        process :resize_to_fit => [200, 200]
      end
    
    protected    
    
        def image?(new_file)
          new_file.content_type.start_with? 'image'
        end
    

    在这种情况下,请确保包含 MimeType:

    include CarrierWave::MimeTypes
    

    【讨论】:

    • 成功了!我什至不需要包括 Mimetypes。那是怎么工作的?实际上没有一个文件以字符串 'image' 开头
    • 实际上有一件事仍然无法解决这个问题。当我尝试仅循环浏览作品集展示页面中的图片时,它仍然包含 pdf 并包含 pdf 的问号图像。如何让它只显示pdf?我会将循环代码添加到内容中。
    • 对于第一条评论,它不会在图像文件名中查找“字符串”,而是在文件 content_type 中查找。 PDF 文件的内容类型中没有“图像”。
    • 如果此响应有效,您能否将其标记为已解决? :) 至于第二条评论,这是另一个问题。您可以再次询问该文件是否是查看 content_type 的图像。我不记得现在具体怎么做,你可以随时谷歌它。如果可以,我稍后会查找。
    • 我会使用你的第二个版本。您可以使用this question 的响应来检查文件是否为图像。
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 2014-07-10
    • 2023-03-26
    • 1970-01-01
    • 2018-02-25
    • 2015-03-15
    • 2017-03-02
    • 2014-02-12
    相关资源
    最近更新 更多