在Ruby中下载文件,重定向到带空格的URL

时间:2017-04-27 10:30:49

标签: ruby open-uri

我试图下载一组图片,并提供他们的网址。某些URL重定向到包含空格的URL,这会导致OpenURI引发错误。

即。我提供的http://www.example.com/upload/comercial%20(2).jpg重定向到https://www.example.com/upload/comercial (2).jpg。这会导致负责下载的代码出错:

url = 'http://www.example.com/upload/comercial%20(2).jpg'
download = open(url, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :all})

OpenURI::HTTPError: 302 Redirect (Invalid Location URI)

有没有办法让OpenURI理解重定向?

观察: 在对空格进行编码后,OpenURI可以正确处理生成的重定向URL:

redirected = 'https://www.example.com/upload/comercial (2).jpg'
encoded = URI.escape(redirected) 
# https://www.example.com/upload/comercial%20(2).jpg

download = open(encoded, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE, allow_redirections: :all})
# Success

显然,在进行open()的调用之前,重定向网址是未知的。

1 个答案:

答案 0 :(得分:4)

你可以做的是手动处理重定向,使用redirect: false选项并从重定向异常中抢救(当它获得重定向响应并且不允许执行它时,open-uri会引发)。然后你编码网址,然后再试一次。像这样:

begin
  open(uri, redirect: false)
rescue OpenURI::HTTPRedirect => redirect
  uri = redirect.uri # assigned from the "Location" response header
  escaped = URI.escape(redirected) 
  open(escaped, redirect: false)
end

你可以在一个方法中隐藏这个逻辑,它将是对其调用者的“一次调用”。抽象很好。