【发布时间】:2017-04-27 10:30:49
【问题描述】:
我正在尝试下载一组图像,并提供了它们的 URL。一些 URL 重定向到包含空格的 URL,这会导致 OpenURI 引发错误。
即我收到了重定向到https://www.example.com/upload/comercial (2).jpg 的http://www.example.com/upload/comercial%20(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() 调用之前,重定向 URL 显然是未知的。
【问题讨论】:
-
@AndreyDeineko 请检查我的编辑 - 重定向 URL 事先未知。问题是如何通过单个
open()调用下载文件,而不管提供的 URL 重定向与否。 -
FWIW 问题出在这里:github.com/ruby/ruby/blob/… 当 OpenURI 命中重定向时,它会在 URL 上调用
URI.parse。URI.parse遵循 RFC-3986,不允许使用空格。如果你想使用 OpenURI,我想不出比 Sergio 下面的更好的解决方案。