我正在使用Carrierwave在我的Rails应用程序中上传PDF。我的目标是将PDF中的每个页面转换为PNG,并确保每个PNG都位于Carrierwave根据我的模型等创建的上传目录中。
目前的进展是我可以上传PDF,将其转换为Carrierwave创建的临时目录中的一系列PNG,但我无法找到将这些转换后的PNG移动到指定的上传目录的正确方法:
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
更新 - 在我当前的尝试和错误代码
下面添加
我目前的代码如下:
def extract(format)
cache_stored_file! if !cached?
images = Magick::ImageList.new(current_path)
images.write File.dirname( current_path ) << "/" << filename
end
def filename
super != nil ? super.split('.').first + '.png' : super
end
所有尝试使用上传目录的任何方法移动文件都会导致某种“无此类文件或目录”错误。例如使用:
images.each do |f|
FileUtils.mv f.filename, File.join("#{Rails.root}/#{store_dir}", "image-0.png")
end
Errno::ENOENT (No such file or directory -
(/Users/reggie/ExampleApp/public/uploads/tmp/20120611-2259-7520-3647/image-0.png,
/Users/reggie/ExampleApp/public/uploads/painting/image/39/image-0.png))
欢迎提出任何建议,以帮助我完成我所遇到的这面墙。
关于为什么我没有使用manipulate逻辑的旁注,示例代码(见下文)与上面的结果相同,即Carrierwave创建的临时目录中的转换文件, 所有转换后的图片都保留.pdf文件扩展名。
manipulate!(:format => :png) do |img|
img
end
答案 0 :(得分:1)
好吧,你的主要问题是你的存储文件夹不存在。
Carrierwave路径构建与“public”文件夹相关。
你应该在你的上传者中使用这样的东西:
process :generate_png
protected
def generate_png
manipulate! do |image, index|
image.format = 'png'
image.write("#{Rails.root}/public/#{store_dir}/image-#{index}.png")
...
end
end
要删除这些文件,请使用callback。
before :remove, :clear_uploader
protected
def clear_uploader
...
end
答案 1 :(得分:0)
如果您对文件重命名的范围进行了适当的设置,则可能能够正确地重命名文件。
对于我来说,这是为了上传SVG,但仅将缩略图重命名为PNG。注意重命名功能在缩略图生成块中的作用范围
version :thumb do
def full_filename(for_file)
super(for_file).chomp(File.extname(super(for_file))) + '.png'
end
process :convert => 'png'
process resize_to_fit: [50, 50]
end
您也许可以得到您的证明书!如果为full_filename函数输入类似的def,则具有正确的文件后缀。