ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片

标签 ruby-on-rails ruby render jpeg

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

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

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

非常感谢任何帮助!

最佳答案

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

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

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

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

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">

关于ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11959203/

相关文章:

ruby-on-rails - 根据request.xhr设置布局?

javascript - 简单的 Jquery 切换不起作用

ruby-on-rails - 在 Rails 中创建 "couple"系统的最佳方法是什么?

ruby-on-rails - 使用 ruby​​/rails geocoder gem 获取 request.location 附近的位置

ruby-on-rails - 使用 SQL 查询(mysql2 类型)获取数据时在 Ruby 中使用分页

javascript - 在 React-Native 中渲染

javascript - Select2 渲染效果不佳,样式已损坏

ruby-on-rails - 在没有互联网连接的情况下自行安装 RVM

ruby-on-rails - Rails/ruby - 如何拯救 ActionView::TemplateError

ruby-on-rails - 我不知道我使用的是哪个版本的 Ruby