当文件名包含问号时,如何从URL中获取完整路径?
问题描述
我有如下URL:
url = www.example.com/resources/am_i_a_file?.pdf
其中文件名包含一个问号(我知道这不太合理)。当我执行以下Ruby代码时:
uri = URI::parse(url) path_raw = uri.path
得到的结果是:resources/am_i_a_file,但我需要获取到:resources/am_i_a_file?.pdf
解决方法
因为URI规范中,问号是路径与查询参数的分隔符,URI::parse会默认将问号前的内容识别为路径,问号后的内容识别为查询参数(即便后面没有实际参数)。要保留路径里的问号,有两种可行方式:
方式一:提前编码URL中的问号
将URL里的问号替换为URL编码值%3F,这样解析时会把它当作路径的一部分:
url = "www.example.com/resources/am_i_a_file?.pdf" # 替换路径中的问号为编码值 encoded_url = url.gsub('?', '%3F') uri = URI.parse(encoded_url) # 此时uri.path为编码后的路径,如需还原问号可解码 require 'cgi' decoded_path = CGI.unescape(uri.path) puts decoded_path # 输出 resources/am_i_a_file?.pdf
方式二:手动拼接路径与问号后的内容
如果不想提前编码,可以判断原URL包含问号且无实际查询参数时,手动将问号及后续内容拼回路径:
url = "www.example.com/resources/am_i_a_file?.pdf" uri = URI.parse(url) path_raw = uri.path # 检查URL含问号且无查询参数时拼接内容 if url.include?('?') && uri.query.nil? path_raw += '?' + url.split('?', 2)[1] end puts path_raw # 输出 resources/am_i_a_file?.pdf
内容的提问来源于stack exchange,提问作者Mark Kenny
相关产品推荐
相关产品推荐

