无论什么要求,都要用sinatra服务一个单一的形象

时间:2014-08-20 18:11:44

标签: ruby sinatra

我用sinatra服务图像,但是当你去拍摄图像时,我希望sinatra能够提供另一张图像。因此,服务器上要求的每个图像都将返回静态图像。

%w[sintra].each{|gem| require gem}

# <img src="https://www.mywebsite.com/1234.png">
# <img src="https://www.mywebsite.com/abcd.png">

get '/:image' do 
 image = params[:image].split(".")[0]
 # image = 1234

 if image == key 
  #do stuff
 else
  #do other stuff
 end

 #this is where I'm having a problem
 special_code_that_replaces_1234.png = "static_image_on_server.png"
 #so sinatra should return "static_image_on_server.png" no matter what image is asked for. 

end

我查看了sinatra的文档。这个具体。 http://www.sinatrarb.com/intro.html#Accessing%20the%20Request%20Object 我可能正在看错误的部分,&#34;触发另一条路线&#34; 我想我在圈子里跑。

我的应用确实有一个&#34; public&#34;目录&#34; static_image_on_server.png&#34;

2 个答案:

答案 0 :(得分:2)

此答案假设您有一个存储图像的目录public/imgs

使用redirect():

require 'sinatra'

get "/imgs/*.*" do
  img_name, ext = params[:splat]

  if image_name == key 
    #do stuff
  else
    #do other stuff
  end

  redirect to('/imgs/alien1.png')
end

默认情况下,Sinatra将首先检查所请求的文件是否在./public文件夹中,如果存在则返回。如果文件不在./public中,那么Sinatra将尝试匹配路由。因此,路由中的代码无法阻止用户查看公用文件夹中的现有图像。

可以disable :static添加到路径文件的顶部,以阻止Sinatra查找./public以获取所请求的文件。相反,Sinatra将直接进行路线匹配。在这种情况下,示例中的redirect()将导致无限循环。因此,如果公共文件夹中的图像不希望用户看到,则不能使用redirect()。

使用send_file():

看起来tadman的send_file()解决方案需要绝对(或相对)文件系统路径,因此您可以这样做:

require 'sinatra'

get "/imgs/*.*" do
  img_name, ext = params[:splat]

  if image_name == key 
    #do stuff
  else
    #do other stuff
  end

  send_file File.expand_path('imgs/alien1.png', settings.public_folder)
end

请注意,使用send_file()时,原始请求图像的原始网址将继续显示在浏览器中,这可能是您想要的,也可能不是。

答案 1 :(得分:1)

通常这样处理:

get '/*.*' do
 # ... Your code ...

 # Send static file.
 send_file 'static_image_on_server.png'
end