1

我正在使用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))

欢迎任何建议来帮助我克服我遇到的这堵墙。

就像我为什么不使用操作逻辑的旁注一样,示例代码(见下文)的结果与上面相同,即在 Carrierwave 创建的临时目录中的转换文件,但是所有转换后的图像都保留在 .pdf 文件中扩大。

manipulate!(:format => :png) do |img|
  img
end
4

2 回答 2

1

Well, your main problem is that your storing folder don't exist.

Carrierwave path construction is relative to "public" folder.

You should use something like this in your uploader:

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

To remove those files use a callback.

before :remove, :clear_uploader 

protected
def clear_uploader
   ...
end
于 2013-02-03T03:10:53.753 回答
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,则具有正确的文件后缀。

于 2018-07-27T18:16:27.173 回答