如何在不下载的情况下使用其 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,因为我得到了302response.code

【讨论】:

我尝试以这种方式做事,但它抛出了未知的主机异常 我无法复制它。使用 Ruby 1.9.3 对我有用。您没有显示您尝试访问的 URL,因此我们无法为您提供帮助。

以上是关于如何在不下载的情况下使用其 URL 检查文件是不是存在?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中是不是可以在不先提取其内容的情况下检查 Zip 文件的内容?

我如何(url)在不破坏 mime 的情况下重写?

Node.js:如何在不上传文件列表的情况下检查文件夹是不是为空

如何检查图片是不是存在于url

如何在不检查路径扩展名的情况下检查文件是不是为图像文件?

如何在 C# 中检查 File.Delete() 是不是会在不尝试的情况下成功?