Rails 3,显示来自 RAILS_ROOT 上方本地文件系统的 jpg 图像

Posted

技术标签:

【中文标题】Rails 3,显示来自 RAILS_ROOT 上方本地文件系统的 jpg 图像【英文标题】:Rails 3, displaying jpg images from the local file system above RAILS_ROOT 【发布时间】:2012-08-11 03:39:03 【问题描述】:

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

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

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

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

出于显而易见的原因,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

现在您的图片可在以下网址下找到:/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">

【讨论】:

谢谢先生!这正是我需要的! 除非我将它部署到 Tomcat,否则它会在几张图片后停止运行。不过,它在 Webrick 下运行良好。嗯?我针对这些问题发布了一个新问题。很郁闷,过不去。我正在考虑用 Grails 重写整个事情并称之为完成。 我对 Tomcat 的经验并不丰富,但是对于 Apache,必须启用 x-sendfile mod 才能使其正常工作。如果它回退到正常的发送文件,下载不会与可能会停止的主要 Ruby 进程分离?抱歉,这只是一个猜测;) x_sendfile 在 apache 中启用。直接访问 Tomcat(端口 8080)会产生同样的问题。太多的痛苦和沮丧,我将考虑在 grails 中编写一个实用程序/服务。为什么在 Rails 根目录之外提供图像如此困难?

以上是关于Rails 3,显示来自 RAILS_ROOT 上方本地文件系统的 jpg 图像的主要内容,如果未能解决你的问题,请参考以下文章

无论什么时候Rails cron,设置环境

Rails - 在项目模型的索引页面上显示来自客户端模型的数据

Redmine插件的安装与卸载,知识库插件安装。

使用回形针 Rails 3 上传的 id 显示来自另一个模型的图像

Rails活动记录单个错误修补程序

Rails:备份mysql数据库脚本