我喜欢生成PDF文件,其中还包括由用户上传的图像。到目前为止,对虾gem还可以工作,还可以嵌入位于文件系统中的图像。我的问题是,我想包括用户上传的图像,这些图像的存储位置可能会在未来发生变化(从文件系统到一些云服务)。我使用dragonfly gem来处理图像,这使用了机架来访问图像,有时还会对它们进行动态处理。
现在最简单的想法不起作用了( 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-request。我可以直接向dragonfly (或rack)要图像吗?对虾使用鸭子类型,需要一些响应read和rewind的对象作为图像。
发布于 2015-07-17 23:38:10
我找到了有关dragonfly file handling的相关文档。以下方法不起作用:report.spot_image.data方法将图像数据作为字符串返回,但是对虾将数据识别为路径,而不是图像数据。dragonfly tempfile方法返回一个已关闭的临时文件,但对虾无法识别它是否可以打开该文件。
我成功地使用了file方法,它返回一个打开的文件句柄。目前还不清楚大虾是否会关闭此文件。所以我使用了块样式的方法来确保文件是关闭的:
report.spot_image.file do |f|
image f
end到目前为止,这是可行的。(尚未使用云存储进行测试)
https://stackoverflow.com/questions/31296315
复制相似问题