新手问题 利用 Carrierwave 上传的图片在 production 环境中不显示

pengedy · 2014年10月24日 · 最后由 serco 回复于 2014年10月24日 · 2351 次阅读

我项目中 Uploader 的代码如下:

# encoding: utf-8

class PhotoUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  process :resize_to_fit => [nil, 600]

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

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

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

  def cache_dir
    "#{Rails.root}/tmp/uploads"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  def filename
    if original_filename
      @name ||= Digest::MD5.hexdigest(current_path)
      "#{@name}.#{file.extension}"
    end
  end

end

利用 Capistrano 部署到 Nginx + Passenger 的生产环境中后,每次上传图片后会根据 uploader 的设置生成两份:

其中第一个图片可以正常显示,第二个(version :thumb)处理过的图片无法显示,报出:

ActionController::RoutingError (No route matches [GET] "/uploads/picture/photo/49/thumb_6d9596c7449d3714eadb74b9c71beec2.jpg")

这样的错误,而实际上thumb_6d9596c7449d3714eadb74b9c71beec2.jpg是存在于该路径下的。

所以,我这是哪里出了问题,该怎么办?...

serve_static_assets link

#1 楼 @leomayleomay 应该设为 false,我在 production.rb 里也确实是这样做的:config.serve_static_assets = false

一般图片都会存储到第三方存储服务中,比如七牛,s3 等!

#3 楼 @huhongda 是的。但是我这里的情况确实没有必要用到云存储。另外我觉得这确实是个问题...

@PengEdy 把存储服务迁移到第三方是未来的方向!好处:方便管理,节省运维资源等等,多的我就不说了!

#4 楼 @PengEdy 第一点,确认下请求时,thumb version 的图片是否已经生成完成了,console 里调一下 recreate_versions, 看看是不是一个情况。 第二点,检查下图片的权限

需要 登录 后方可回复, 如果你还没有账号请 注册新账号