File.basename(open(source_url))
不起作用,因为open(source_url)
返回某种 I/O 句柄,而不是File.basename
期望的字符串。
File.basename(source_url)
将有更好的工作机会,除非 URL 使用某种path/to/service/with/parameters/in/line/like/this
类型编码。
不过,Ruby 的 URI 库有一些有用的工具可以提供帮助。就像是:
File.basename(URI.parse(source_url).path)
将是一个起点。例如:
require 'uri'
File.basename(URI.parse('http://www.example.com/path/to/file/index.html').path
# => "index.html"
和:
File.basename(URI.parse('http://www.example.com/path/to/file/index.html?foo=bar').path)
# => "index.html"
你知道我是否也可以检索文件大小以及如何?
在本地测试 HTTP 内容的一个好方法是从命令行运行gem server
,然后让 gems 启动一个小型 Web 服务器来获取它的文档:
require 'open-uri'
html_doc = open('http://0.0.0.0:8808/') do |io|
puts io.size
io.read
end
puts html_doc.size
# => 114350
# => 114350
当您通过 OpenURI 的命令使用块时open
,它使您可以访问块变量中有关连接的大量信息,该变量是Tempfile
类的一个实例。因此,您可以使用size
.
这对于小文件来说是可以的,但是如果您要拉入一个大文件,您可能需要使用 Net::HTTP 进行调查以发送head
请求,其中可能包括大小。我说可能,因为有时服务器不知道会返回多少,在动态内容的情况下,或者内容被 CGI 或不费心说的子服务返回的情况下。
使用“head”请求的优点是服务器不返回整个内容,只返回标头。因此,在过去,我使用head
, 来提出请求,以查看是否可以获得所需的数据。如果没有,我将被迫使用正常的get
.