如何在不下载的情况下使用其 URL 检查文件是不是存在?
Posted
技术标签:
【中文标题】如何在不下载的情况下使用其 URL 检查文件是不是存在?【英文标题】:How do I check if a file exists using its URL without downloading it?如何在不下载的情况下使用其 URL 检查文件是否存在? 【发布时间】:2013-04-12 06:37:28 【问题描述】:我需要编写代码,通过检查文件的 URL 来确定文件是否存在。
目前我实现了这个:
error_code = 400;
response = Net::HTTP.get_response(URI(url));
return response.code.to_i < error_code;
但是,它无法正常工作,因为每次下载文件时,如果我有大文件或很多文件,这真的很慢。
不下载文件如何判断远程端是否存在文件?
【问题讨论】:
您可以访问服务器端代码吗?你能改变控制器吗? 不要以;
结尾。这不是 C 或 Perl。
参见HTTP verbs,特别是HEAD
方法。如果您更了解动词,您会发现更容易找到完成此类工作的方法,无论库如何。
Check if URL exists in Ruby的可能重复
【参考方案1】:
如果你想使用 Net::HTTP 那么你可以这样做:
uri = URI(url)
request = Net::HTTP.new uri.host
response= request.request_head uri.path
return response.code.to_i == 200
【讨论】:
值得指出的是,Net::HTTP
包含在展台 Ruby 规范中。
请注意其他有效的响应代码,例如 301,该文件实际上可以存在于从第一个请求中检索的下一个 url 中。即:tinyurl
要使用Net::HTTP
,导入它:require 'net/http'
【参考方案2】:
做这样的事情
require "rest-client"
begin
exists = RestClient.head("http://google.com").code == 200
rescue RestClient::Exception => error
exists = (error.http_code != 404)
end
那么“exists”是一个布尔值,取决于它是否存在。这只会得到头信息,而不是文件,所以对于小文件或大文件应该是一样的。
【讨论】:
很好,但我不想为此使用额外的 gem 或库 明白,不幸的是,我不确定在不使用 rest-client 之类的东西的情况下如何做到这一点。祝你好运!【参考方案3】:我会这样写:
require 'net/http'
ERROR_CODE = 400
response = Net::HTTP.start('www.example.net', 80) do |http|
http.request_head('/index.html')
end
puts response.code.to_i < ERROR_CODE
输出true
,因为我得到了302
的response.code
。
【讨论】:
我尝试以这种方式做事,但它抛出了未知的主机异常 我无法复制它。使用 Ruby 1.9.3 对我有用。您没有显示您尝试访问的 URL,因此我们无法为您提供帮助。以上是关于如何在不下载的情况下使用其 URL 检查文件是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中是不是可以在不先提取其内容的情况下检查 Zip 文件的内容?