我们在使用Carrierwave时遇到了一些麻烦,我将尝试解释我们的问题。
我们需要在API中生成端点以将图像上传到AWS S3,这些图像仅对前端有意义,因此我们没有将载波上传器与模型相关联。我们也处理了一些图像版本。
到目前为止我们能够完成这项工作,但我们想要异步执行此过程,因此我们需要预先定义图像及其所有版本的文件名。 我们能够向上传者发送预定义的文件名,但上传者只使用该文件名作为原始版本,版本存储为前缀(“small_.jpg”,“medium_.jpg”,...)所以他们被覆盖了。
我发现这是关于自定义文件名的: How to: Customize your version file names和CarrierWave: Create the same, unique filename for all versioned files
这两个链接对于理解问题很有用,我们甚至将它用于其他上传者,但我们的问题有点不同
如果有人在类似或有想法的地方工作过,我会非常乐于助人!
非常感谢!
更新
添加一些代码(2016/06/24)
这是我的控制器代码:
class MyController < ApplicationController
def upload
base64_string = params[:resource]
file_name = SecureRandom.uuid + ".jpg" #<= The filename I wanted to parameterize
# This code should be delayed =>
base64 = Base64.decode64(base64_string.partition(',').last)
image = MiniMagick::Image.read(base64)
uploader = MyUploader.new
File.open(image.path) { |file| something = uploader.store!(file) }
# <=
return file_name
end
end
我的上传代码:
class MyUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
storage :fog
def store_dir
"some/custom/dir/"
end
version :large do
process :resize_to_fit => [630, 450]
end
version :medium, :from_version => :large do
process :resize_to_fit => [420, 300]
end
version :small, :from_version => :large do
process :resize_to_fit => [315, 225]
end
def filename
"#{secure_token}.jpg"
end
protected
def secure_token
SecureRandom.uuid
end
end
上传器中的'secure_token'方法被定义为解决方法。我想使用控制器中定义的'file_name'