我喜欢生成PDF文件,其中还包含用户上传的图像。虾宝石到目前为止工作,并且还可以嵌入位于文件系统中的图像。 我的问题是我想要包含用户上传的图像,这些图像的存储位置将来可能会发生变化(从文件系统到某些云服务)。 我使用蜻蜓宝石来处理图像,这使用机架来访问图像,有时还可以动态处理它们。
现在最简单的想法不起作用
(report
是我的对象,spot_image
是我的图像字段)
image report.spot_image
no implicit conversion of #<Class:0x007fc07ecf1110> into String
我还尝试使用open-uri通过http打开文件。这应该可以工作,但它会在我的开发机器上阻塞,我认为因为开发rails服务器是单线程的:
image_path = report.spot_image.remote_url
image_url = "#{view.request.protocol}\#view.request.host_with_port}
/#{image_path.sub(/^\//,"")}"
image open(image_url) # timeout in development-mode
它可能在生产中起作用,但即便如此,它也会产生不必要的http请求。我可以直接问蜻蜓(或架子)图像吗? prawn使用duck-typing,需要一些响应read
和rewind
的对象作为图像。
答案 0 :(得分:0)
我找到了有关dragonfly file handling的相关文档。以下不起作用:
report.spot_image.data
方法将图像数据作为字符串返回,但是prawn将数据识别为路径而不是图像数据。 dragonfly tempfile
方法返回一个已关闭的临时文件,但是大虾无法识别它可以打开它。
我使用file
方法取得了成功,该方法返回一个打开的文件句柄。目前还不清楚虾是否正在关闭此文件。所以我使用块样式方法来确保文件已关闭:
report.spot_image.file do |f|
image f
end
到目前为止这是有效的。 (尚未通过云存储测试)