我是直接把文件储存到了 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 来问问各位大神了。