OpenURI::HTTPError(500 内部服务器错误)与 open-uri
OpenURI::HTTPError (500 Internal Server Error) with open-uri
我正在尝试从 URL 下载图片,URL 来自 facebook。我在使用 omniauth-facebook 注册后得到 URL:
步骤如下:
$ irb
>> require 'open-uri'
>> open("http://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD")
这是结果:
Traceback (most recent call last):
13: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `<main>'
12: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `load'
11: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
10: from (irb):8
9: from (irb):8:in `rescue in irb_binding'
8: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:35:in `open'
7: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:736:in `open'
6: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:165:in `open_uri'
5: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `open_loop'
4: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `catch'
3: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:226:in `block in open_loop'
2: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
1: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:378:in `open_http'
OpenURI::HTTPError (500 Internal Server Error)
尝试相同但使用 https 而不是 http:
Traceback (most recent call last):
12: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `<main>'
11: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `load'
10: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
9: from (irb):12
8: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:35:in `open'
7: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:736:in `open'
6: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:165:in `open_uri'
5: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `open_loop'
4: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `catch'
3: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:226:in `block in open_loop'
2: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
1: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:378:in `open_http'
OpenURI::HTTPError (400 Bad Request)
将 URL 放入浏览器:
http://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD
它可以毫无问题地下载它,当我尝试将 open-uri 与另一个图像 link 一起使用时,它也可以正常工作。我不知道为什么它会导致来自 facebook 的图像出现问题。
解决方案
感谢@Gowtham 的帮助,我设法下载了图像并使用 Active Storage 保存它,这是我的代码:
url = "https://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD"
begin
file = File.open('user_avatar.jpeg', 'wb') do |file|
file << open(url).read
end
user.avatar.attach(io: File.open(file), filename: 'user_avatar.jpeg')
rescue Exception => e
p e.message, e.backtrace.inspect
end
使用 HTTPS 尝试以下操作 URL
require 'open-uri'
url = "https://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD"
begin
File.open('test.jpeg', 'wb') do |file|
file << open(url).read
end
rescue Exception => e
p e.message, e.backtrace.inspect
end
我正在尝试从 URL 下载图片,URL 来自 facebook。我在使用 omniauth-facebook 注册后得到 URL:
步骤如下:
$ irb
>> require 'open-uri'
>> open("http://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD")
这是结果:
Traceback (most recent call last):
13: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `<main>'
12: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `load'
11: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
10: from (irb):8
9: from (irb):8:in `rescue in irb_binding'
8: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:35:in `open'
7: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:736:in `open'
6: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:165:in `open_uri'
5: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `open_loop'
4: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `catch'
3: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:226:in `block in open_loop'
2: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
1: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:378:in `open_http'
OpenURI::HTTPError (500 Internal Server Error)
尝试相同但使用 https 而不是 http:
Traceback (most recent call last):
12: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `<main>'
11: from /home/abdel/.rbenv/versions/2.6.5/bin/irb:23:in `load'
10: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
9: from (irb):12
8: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:35:in `open'
7: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:736:in `open'
6: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:165:in `open_uri'
5: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `open_loop'
4: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:224:in `catch'
3: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:226:in `block in open_loop'
2: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:756:in `buffer_open'
1: from /home/abdel/.rbenv/versions/2.6.5/lib/ruby/2.6.0/open-uri.rb:378:in `open_http'
OpenURI::HTTPError (400 Bad Request)
将 URL 放入浏览器:
http://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD
它可以毫无问题地下载它,当我尝试将 open-uri 与另一个图像 link 一起使用时,它也可以正常工作。我不知道为什么它会导致来自 facebook 的图像出现问题。
解决方案
感谢@Gowtham 的帮助,我设法下载了图像并使用 Active Storage 保存它,这是我的代码:
url = "https://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD"
begin
file = File.open('user_avatar.jpeg', 'wb') do |file|
file << open(url).read
end
user.avatar.attach(io: File.open(file), filename: 'user_avatar.jpeg')
rescue Exception => e
p e.message, e.backtrace.inspect
end
使用 HTTPS 尝试以下操作 URL
require 'open-uri'
url = "https://graph.facebook.com/v4.0/10224315028492218/picture?access_token=EAAPhFIKqb2IBAO6ekZAGnQyoqkxrmoBRAN8Qfc115SJkOzu5wOmCZB6C7IKtql3ZCIEw8NU66RXrmoFZAszU6G3VeXaz7KHZAmS2NVzF5uRKTEonQ43r1ZB8q1otb5MUmEW7YySXcINREet1xG8i1II5apMif97TAxpMoqDXwz9AZDZD"
begin
File.open('test.jpeg', 'wb') do |file|
file << open(url).read
end
rescue Exception => e
p e.message, e.backtrace.inspect
end