5

我试图找出一种方法来显示来自不在 RAILS_ROOT 下的已安装文件系统(在 RedHat 或 Ubuntu 环境中)的图像。我不想使用符号链接,因为这个应用程序实际上是通过 Tomcat 部署的,而当我关闭 Tomcat 时,Tomcat 会尝试遵循符号链接并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在 public/images 下也不是一种选择。

我查看了 send_file,但这只会显示一个图像。我需要在格式良好的页面中显示 6 个请求的图像。由于膨胀,我宁愿不使用 Base64 编码,但我不知道如何将图像数据与渲染页面一起传递。

同样,问题是无法通过生成的 HTML 中的 url 访问图像,图像数据必须与页面的其余部分一起传递。我知道创建某种类型的服务来提供图像将是处理这个问题的最佳方式,但现在我只需要让它工作。

非常感谢任何帮助!

4

1 回答 1

12

出于显而易见的原因,Rails 不允许用户访问RAILS_ROOT/public. 当您提到 sendfile(或首选 x-sendfile)时,您实际上是其中的一部分。解决方案是让 Rails 正常提供一个 html 页面,其中包含指向提供单个文件的 Rails 操作的链接。

例如,假设我想显示来自文件系统深处某处的一些图像。首先,我必须创建一个一次提供一个图像的动作。因此,config/routes.rb您可以添加以下内容:

match '/serve_image/:filename' => 'images#serve'

然后我必须创建一个控制器来匹配该路由。例如:

class ImagesController < ApplicationController
  def serve
    path = "/my/servers/image/path/#{params[:filename]}"

    send_file( path,
      :disposition => 'inline',
      :type => 'image/jpeg',
      :x_sendfile => true )
  end
end

现在,您的图片可在以下 url 下获得:/serve_image/my_image.jpg。所以最后要做的是创建一个漂亮的 html 页面,显示所有必要的图像。它很简单:

<img src="/serve_image/image1.jpg">
<img src="/serve_image/image2.jpg">
<img src="/serve_image/image3.jpg">
<img src="/serve_image/image4.jpg">
于 2012-08-14T21:07:37.490 回答