Rails carrierwave 和 mini_magic 图片上传和处理问题

runup · September 05, 2016 · Last by maxchen replied at February 13, 2018 · 3277 hits

问题描述:对于尺寸小 (500*500) 的图片能够正常显示,但是对于尺寸大 (1000*1000) 的图片上传成功,但是显示不出来。controller 设置如下。

class PictureUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url
  #   # For Rails 3.1+ asset pipeline compatibility:
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
  #
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process :scale => [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
  # version :thumb do
  #   process :resize_to_fit => [50, 50]
  # end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  # def extension_white_list
  #   %w(jpg jpeg gif png)
  # end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end

end

注:使用 process :resize_to_fit=>[1200,1200],也无法完成显示大图片的功能。 解决:查看 chrome 的 network,发现是图片加载失败,错误如下:

net::ERR_BLOCKED_BY_CLIENT

显示被客户端拦截,我的 chrome 装了 adblock 插件,我把http://localhost:3000加入到白名单中,就可以显示图片了。

在这个文件里边给它上传的大小限制一下,比如 process resize_to_fit: [500, 200]

#1 楼 @wuxuan 我想上传大尺寸的图片,比如 1000*300,如何进行设置?

#1 楼 @wuxuan 在这个 controller 文件中设置如下方法

process :resize_to_fit => [800, 800]

但是报错,不存在 resize_to_fit 方法。

include CarrierWave::MiniMagick 放开注释

默认就没处理,不能正常显示是什么情况?

7 Floor has deleted
8 Floor has deleted

#5 楼 @Rei #6 楼 @wuxuan #4 楼 @guojhq 问题已经更新,能否帮忙解释下,感谢。

#9 楼 @runup 无法显示是什么情况?url 没有响应?上传目录没有文件?文件类型不对?这些用手头的浏览器、命令行不能自己确认吗?

#10 楼 @Rei 图片上传到相应的文件夹,但是图片显示不出来。

View 里面的生成图片链接的代码和你制定的大图片的 version 名字贴出来看看

#12 楼 @renyuanz

#图片显示代码,500*500可以显示,1000*500不能显示
<%= image_tag @resume.attachment_url %>

其他代码没有变动,包括 version

浏览器直接打开图片链接能不能看,浏览器调试 Network 的状态,css 有没有问题。

@runup 我感觉是因为你没制定大图片 version 导致的问题

如果你有定义图片版本的代码,类似

version :thumb do
  process :resize_to_fit => [50, 50]
end

那么你在 view 里面想指定使用这个 thumb 版本的图片,可以这么写

<%= image_tag @resume.attachment_url(:thumb) %>

你可以试试

因为你也没说具体是什么报错,所以我猜可能是这个原因😅

#14 楼 @Rei 谢谢帮忙找到问题的解决方式。按照您的建议,查看 chrome 的 network,发现是图片加载失败,错误如下:

net::ERR_BLOCKED_BY_CLIENT

显示被客户端拦截,我的 chrome 装了 adblock 插件,我把http://localhost:3000加入到白名单中,就可以显示图片了。

#16 楼 @renyuanz 已经解决,参考楼上的解释,感谢帮忙哈~

两个问题: 1.User 模型中的 image 字段关联了图片上传器,在 uploader 中设置了

small ,:middle

两个 version,请问是用

@user.image.small.url@user.image.middle.url

来分别获取吗? 2.帮助文档中有这样一段

The model variable points to the instance object the uploader is attached to.

请问其中的 model 指的是 User 还是字段 image 呢?

You need to Sign in before reply, if you don't have an account, please Sign up first.