我用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;
答案 0 :(得分:2)
此答案假设您有一个存储图像的目录public/imgs
:
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()。
看起来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