Ruby 与sinatra一起提供一张图片,无论要求什么

Ruby 与sinatra一起提供一张图片,无论要求什么,ruby,sinatra,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

我正在为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
%w[sintra]。每个{| gem |需要gem}
# 
# 
获取“/:image”do
image=params[:image]。拆分(“.”[0]
#图像=1234
如果图像==键
#做事
其他的
#做其他事情
结束
#这就是我遇到的问题
替换\u 1234.png=“static\u image\u on\u server.png”的特殊\u代码
#因此,无论需要什么图像,sinatra都应该返回“static_image_on_server.png”。
结束
我已经查阅了sinatra的文档。这是明确的。 我可能看错了“触发另一条路线” 我想我在兜圈子


我的应用程序确实有一个“公共”目录,带有“static\u image\u on\u server.png”

通常情况下,这是这样处理的:

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

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

此答案假设您有一个目录
public/imgs
,用于存储图像:

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

您可以将
disable:static
添加到路由文件的顶部,以阻止Sinatra查找请求文件的/public。相反,西纳特拉将直接进行路线匹配。在这种情况下,示例中的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(),原始url以及原始请求的图像将保持显示在浏览器中,这可能是您想要的,也可能不是您想要的。

将路径切换到
get'/*.*.'
是否更有效?您可能希望确保所有图像都位于
/images
中,以使此映射更加具体。数据的输入方式是任意的。我不能在它的位置注入另一个图像。或者我不明白为什么有人会这样。啊,如果你不能控制进入的路线,那么你需要一条综合路线。当然,将来会有一个验证。我还没想到。听起来有点老套。我在apache配置中使用ProxyPass来允许多个sinatra应用程序。你能发布一个你上面评论的例子/文档的链接吗?我创建了一个与你上面代码相匹配的新路由,我得到了一个404错误的原始图像。我还注释了我的代码。你的Sinatra日志里有什么吗?就是这样。我只需要重新定向。非常感谢。@user2446058,嗯……既然我发布了它,我想知道为什么它不会导致无限循环?@user2446058,看起来send_file()需要一个绝对的文件系统路径,所以我添加了一个如何让send_file()工作的示例。@user2446058,默认情况下,Sinatra将首先检查请求的文件是否在./public文件夹中,如果存在则返回。如果文件不在./public中,则Sinatra将尝试匹配路由。如果我在文件顶部添加
disable:static
,那么Sinatra将不会在/public中查找文件,而是直接进入路由匹配。在这种情况下,我的解决方案将导致一个无限循环。因此,如果公用文件夹中有不希望用户看到的图像,则不能使用redirect()。
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