我正在使用Carrierwave上传一些图像并生成它们的不同版本(大小,颜色......)。上传时每个图像都有一个唯一的名称,我现在正在尝试在后台处理图像,以避免阻止Web进程。我使用carrierwave_backgrounder
。
问题在于处理我的图像时,会给它一个新名称。因此模型不知道这个新名称,原始图像现在在服务器上两次。
我最终得到了这种文件:
f9f97657-eaab-40ce-b965-31bb128066ee.jpg // First uploaded images
e4244551-7f43-4c03-8747-e8f2f2e57156.jpg // Copy of the original image created while processed in the background
thumb_e4244551-7f43-4c03-8747-e8f2f2e57156.jpg
而event.image
会返回f9f97657-eaab-40ce-b965-31bb128066ee.jpg
。
如果我们只是在后台处理不同的版本而不上传它们,我该如何避免生成新的文件名?
我的模特:
class Event < ActiveRecord::Base
mount_uploader :cover_image, CoverImageUploader
process_in_background :cover_image
end
我的上传者:
class CoverImageUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
include CarrierWave::MimeTypes
include Sprockets::Helpers::RailsHelper
include Sprockets::Helpers::IsolatedHelper
include ::CarrierWave::Backgrounder::Delay
def filename
"#{secure_token}.#{file.extension}" if original_filename
end
process :set_content_type
version :thumb do
process resize_to_fill: [200, 200]
end
# ...
# Some other versions processing...
# ...
protected
def secure_token
var = :"@#{mounted_as}_secure_token"
model.instance_variable_get(var) || model.instance_variable_set(var, SecureRandom.uuid)
end
end
答案 0 :(得分:2)
可以试试这个:
def filename
if original_filename.present?
if model.respond_to?("#{mounted_as}_processing") && model.send("#{mounted_as}_processing")
@name ||= model.send("#{mounted_as}_identifier")
else
@name ||= "#{secure_token}.#{file.extension}"
end
end
end
仅在表格中有“处理”列时才有效