2012-08-14 77 views
4

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

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

此外,问题是无法通过生成的HTML中的URL访问图像,图像数据必须与页面的其余部分一起传递。我知道创建某种类型的服务来映射服务器将是处理此问题的最佳方式,但现在我只需要使其工作。

任何帮助非常感谢!

回答

11

由于显而易见的原因,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"> 
+0

谢谢先生!这完全是我需要的! – clovold 2012-08-15 12:23:01

+0

除了当我将它展示给Tomcat之后,它会在一对夫妇的图片之后停顿。但它在Webrick下运行良好。咦?我发布了一个有关这些问题的新问题。非常沮丧,无法摆脱这一点。我正在考虑在Grails中重写整个事情并将其完成。 – clovold 2012-11-28 11:48:33

+0

我对Tomcat并没有太大的经验,但是使用Apache时必须启用x-sendfile mod才能正常工作。如果它回退到正常的sendfile,那么下载不会从可能导致它失速的主要Ruby进程中分离出来?对不起,这只是一个猜测;) – 2012-11-29 16:38:58

相关问题