我試圖下載一組圖像,並提供其URL。一些URL重定向到包含空格的URL,這會導致OpenURI引發錯誤。使用Ruby下載重定向到帶有空格的URL的文件
即我提供的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瞭解重定向?
觀察: 產生的重定向URL可以通過OpenURI編碼,像這樣的空間後,正確處理:直到open()
呼叫由
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
顯然重定向URL是未知的。
@AndreyDeineko請檢查我的編輯 - 重定向網址事先不知道。問題是如何使用單個'open()'調用下載文件,而不管提供的URL是否重定向。 – mrt
FWIW問題在這裏:https://github.com/ruby/ruby/blob/52c738408e7624d1f6ebb8c62a7497fed2684bf5/lib/open-uri.rb#L356-L360當OpenURI命中重定向時,它會調用URL上的URI.parse 。 'URI.parse'遵守[RFC-3986](https://tools.ietf.org/html/rfc3986),它不允許有空格。如果你想使用OpenURI,我想不出比Sergio的更好的解決方案。 –