【问题标题】:Prawn PDF: how to add images uploaded with dragonfly大虾PDF:如何添加蜻蜓上传的图片
【发布时间】:2015-07-08 14:54:14
【问题描述】:

我喜欢生成 PDF 文件,其中还包括用户上传的图像。到目前为止,prawn gem 可以工作,并且还可以嵌入位于文件系统中的图像。 我的问题是我想包含用户上传的图像,并且这些图像的存储位置将来可能会改变(从文件系统到某些云服务)。 我使用蜻蜓 gem 来处理图像,这使用 rack 来访问图像,有时会动态处理它们。

现在最简单的想法行不通 (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 使用鸭子类型,需要一些响应 readrewind 的对象作为图像。

【问题讨论】:

  • It may probably work in production, but even then it does a needless http-request - 你说的不需要是什么意思?如果它是一个远程图像,那么某些组件将不得不发出一个 http 请求来获取它以供您嵌入

标签: ruby-on-rails ruby rack prawn dragonfly-gem


【解决方案1】:

我找到了有关dragonfly file handling 的相关文档。以下没有工作: report.spot_image.data 方法将图像数据作为字符串返回,但大虾将数据识别为路径而不是图像数据。蜻蜓tempfile方法返回一个关闭的临时文件,但是大虾不识别可以打开。

我使用file 方法取得了成功,该方法返回一个打开的文件句柄。目前尚不清楚大虾是否正在关闭此文件。所以我使用了块式的方法来确保文件是关闭的:

   report.spot_image.file do |f|
       image f
   end

到目前为止,这有效。 (尚未使用云存储进行测试)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多