新手问题 CarrierWave Multiple file uploads 多张图片上传时遇到上传的图片变成同一张图片

a4652097 · 2015年12月31日 · 最后由 torvaldsdb 回复于 2016年04月29日 · 2884 次阅读

我是直接把文件储存到了 public 下,在本地运行是可以的。但是在服务器上运行的话就会出现上传多张不同的图片后,储存的时候变成储存同一张图片了。

我上传了两张图片查看服务器日志 这个是参数

Parameters: {"utf8"=>"✓", "authenticity_token"=>"+4HZifzZy2Alps2IzQ2VdCa83CduJaV+syos6JgEjQaFFokk7e2Menrr/jltEObenLEwuy9NxA4pYwbQuLEzEA==", "report"=>{"app_photos"=>[#<ActionDispatch::Http::UploadedFile:0x007fa302be4270 @tempfile=#<Tempfile:/var/folders/9g/qs8svjp97ydgzqzhbhxpthhc0000gn/T/RackMultipart20151231-33133-18p6wl3.jpg>, @original_filename="87fb7227dce3653a297525ffd2a12fd2.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"report[app_photos][]\"; filename=\"87fb7227dce3653a297525ffd2a12fd2.jpg\"\r\nContent-Type: image/jpeg\r\n">, #<ActionDispatch::Http::UploadedFile:0x007fa302be4248 @tempfile=#<Tempfile:/var/folders/9g/qs8svjp97ydgzqzhbhxpthhc0000gn/T/RackMultipart20151231-33133-srb0n4.jpg>, @original_filename="520900d78c47f.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"report[app_photos][]\"; filename=\"520900d78c47f.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, "commit"=>"上传中", "sale_id"=>"1", "id"=>"8"}

这个是添加语句

INSERT INTO `reports` (`app_photos`, `sale_id`, `meeting_id`, `created_at`, `updated_at`) VALUES ('[\"38060cf588c242abbfab8eb523c593dd.jpg\",\"38060cf588c242abbfab8eb523c593dd.jpg\"]', 1, 8, '2015-12-31 03:49:22', '2015-12-31 03:49:22')

参数是正确的,可是这里变成同一个文件名了。 代码里 controller

def params_reports
params.require(:user).permit({app_photos: []})
end
def create_phots
    @reports = Report.new(params_reports)
    @reports.save
end

model

class Report < ActiveRecord::Base
  attr_accessor :uploader_secure_token
  mount_uploaders :app_photos, AvatarUploader
end

这个是我的 AvatarUploader

require 'carrierwave/processing/mini_magick'
# 在图片空间里面定义好的“缩略图版本名称”,以防止调用错误
IMAGE_UPLOADER_ALLOW_IMAGE_VERSION_NAMES = %(20x20 30x30 240x240 100x100 120x90 160x120 250x187 320 640 800)
class AvatarUploader < CarrierWave::Uploader::Base
  def store_dir
    "#{model.class.to_s.underscore}/#{mounted_as}"
  end

  def default_url
    # 搞一个大一点的默认图片取名 blank.png 用 FTP 传入图片空间,用于作为默认图片
    # 由于有自动的缩略图处理,小图也不成问题
    # Setting.upload_url 这个是你的图片空间 URL
    "#{Setting.upload_url}/blank.png#{version_name}"
  end

  # 覆盖 url 方法以适应“图片空间”的缩略图命名
  def url(version_name = "")
    @url ||= super({})
    version_name = version_name.to_s
    return @url if version_name.blank?
    if not version_name.in?(IMAGE_UPLOADER_ALLOW_IMAGE_VERSION_NAMES)
      # 故意在调用了一个没有定义的“缩略图版本名称”的时候抛出异常,以便开发的时候能及时看到调错了
      raise "ImageUploader version_name:#{version_name} not allow."
    end
    [@url,version_name].join("!") # 我这里在图片空间里面选用 ! 作为“间隔标志符”
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  def filename
    if super.present?
      model.uploader_secure_token ||= SecureRandom.uuid.gsub("-","")
      Rails.logger.debug("(BaseUploader.filename) #{model.uploader_secure_token}")
      "#{model.uploader_secure_token}.#{file.extension.downcase}"
    end
  end
end

bug 找了半天 google 后也没有发现出现过我这种问题,所以只好来 rubychina 来问问各位大神了。

把 class AvatarUploader 贴一下?

@a4652097 问题以及最后的解决方案能说一下么

a4652097 关闭了讨论 12月11日 17:22
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册