【问题标题】: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 方法。如果您更了解动词,您会发现更容易找到完成此类工作的方法,无论库如何。

标签: ruby-on-rails ruby http


【解决方案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,因此我们无法为您提供帮助。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2013-02-01
  • 2019-04-06
  • 2018-09-22
相关资源
最近更新 更多