URL이 제공되는 일련의 이미지를 다운로드하려고합니다. 일부 URL은 공백이있는 URL로 리디렉션되어 OpenURI가 오류를 발생시킵니다.공백이있는 URL로 리디렉션되는 Ruby의 파일 다운로드
즉 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을 리디렉션 결과 : 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 제 편집을 확인하십시오. 리디렉션 URL은 미리 알 수 없습니다. 문제는 제공된 URL 리디렉션에 관계없이 단일 'open()'호출로 파일을 다운로드하는 방법입니다. – 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보다 더 나은 솔루션을 생각할 수 없습니다. –