我正试图找出一种方法来显示不受RAILS_ROOT(在RedHat或Ubuntu环境下)的已安装文件系统中的图像。我不想使用符号链接,因为这个应用程序实际上是通过Tomcat部署的,当我关闭Tomcat时,Tomcat会尝试遵循符号链接并删除挂载中的所有图像。由于这些文件的数量和大小,将图像置于公共/图像下也不是一种选择。
我查看了send_file,但这只会显示一个图像。我需要在格式很好的页面中显示6个请求的图像。我不想使用Base64编码因为膨胀,但我不知道如何用渲染页面传递图像数据。
同样,问题是在生成的HTML中无法通过url访问图像,图像数据必须与页面的其余部分一起传递。我知道创建某种类型的服务来处理图像将是解决这个问题的最好方法,但是现在我只需要让它工作。
任何帮助都非常感谢!
答案 0 :(得分: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
现在您的图片位于网址:/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">