sinatra的send_file决定使用哪种内容类型的过程是什么?
例如,似乎它通过传递给send_file的文件扩展名起作用,因此,如果它是send_file blah.txt。然后,当我http://路由时,我将获得/响应头将为content-type: text/plain
,因此txt文件中的所有html都将被网络浏览器解释为纯文本。而如果文件是blah.html,则服务器将以content-type: text/html
进行响应。(文件中的所有html都将以此形式呈现)
当然,路由名称是无关紧要的,因此您可以转到http://127.0.0.1:4567/zzz.html
,它可能导致send_file a.txt,而a.txt可能包含html标签,但是由于它是.txt
文件,因此send_file将导致sinatra以content-type: text/plain
响应,浏览器将不呈现发送的任何html,并将其显示为纯文本。我可能错了,但这似乎是我的快速测试所表明的。在我尝试使用不同路由,使用不同文件扩展名(.txt和.html)的地方,有时在其中包含html的文件有时不这样做,查看浏览器是否呈现html,并使用wget查看内容类型标头是什么- d。
那么,与此相关的我的问题是,是否存在sinatra的send_file函数使用的列表,该列表将文件扩展名与内容类型相关联?我希望看到那个清单。如果没有,那么它正在使用什么过程。
注意-我知道有一种方法可以传递内容类型Sinatra: How to respond with an image with headers "content-type" => "image/jpeg" 但是我在问如何/通过什么方法,当没有传入任何内容类型时,send_file确定内容类型。
答案 0 :(得分:1)
This is the send_file
method在Sinatra框架(当前为v2.0.5)中,请注意,如果没有设置内容类型,它将立即找出内容类型:
if opts[:type] or not response['Content-Type']
content_type opts[:type] || File.extname(path), :default => 'application/octet-stream'
end
The content_type
method将立即返回或移交给Rack's mime_type
method的委托人mime_type
(当前为v2.0.7)。这使用一个众所周知的扩展列表进行检查。
def mime_type(ext, fallback='application/octet-stream')
MIME_TYPES.fetch(ext.to_s.downcase, fallback)
end
列表以on line 49开头:
MIME_TYPES = {
".123" => "application/vnd.lotus-1-2-3",
".3dml" => "text/vnd.in3d.3dml",
".3g2" => "video/3gpp2",
".3gp" => "video/3gpp",
# <snip>
如您从content_type
片段中所见,其默认设置为application/octet-stream
。