将 gravatar 保存到 activeStorage

saving a gravatar to activeStorage

提问人:Jerome 提问时间:12/30/2022 更新时间:12/30/2022 访问量:40

问:

控制台中的以下 cUrl 命令,按照 gravatar 说明将图像保存到从中调用它的目录中

curl "https://www.gravatar.com/avatar/ZUETpSoXKBP5VXW4qQnQFIZcLpxh5Ix2?d=identicon" --output 'temp_avatar'

但是,为了避免命中他们的服务器,目标是让操作通过 ActiveStorage 保存输出

class UserPreference < ApplicationRecord
  has_one_attached :identicon

和控制器操作

    if !current_user.user_preference.identicon.present?
      puts 'identicon absent'
      result = Net::HTTP.get_response(URI.parse("https://www.gravatar.com/avatar/#{current_user.virtual_qr_code}.jpg?d=identicon --output '#{current_user.id}_avatar' "))
      puts result.inspect
       current_user.user_preference.identicon.attach(result)

结果有点令人困惑。这些命令得到一个响应,但与直接处理 cUrl 不同puts

identicon absent
#<Net::HTTPFound 302 Found readbody=true>

Could not find or build blob: expected attachable, got #<Net::HTTPFound 302 Found readbody=true>

当通过 Net::HTTP 调用时,期望图像输出会有所不同,这是错误的吗?
应该如何调用它来通过 ActiveStorage 保存?

Ruby-on-Rails 卷曲 Gravatar

评论


答:

1赞 Frederik Spang 12/30/2022 #1

看起来您已将一些 CURL 命令包含在 Net::HTTP 调用的 URL 中,并尝试将此字符串作为您实际想要的 URL 调用:"https://www.gravatar.com/avatar/#{current_user.virtual_qr_code}.jpg?d=identicon --output '#{current_user.id}_avatar' ""https://www.gravatar.com/avatar/#{current_user.virtual_qr_code}.jpg?d=identicon"

不能在 URL 中使用 --output,但应改用 GET 请求的返回正文。

    if !current_user.user_preference.identicon.present?
      puts 'identicon absent'
      result = Net::HTTP.get_response(URI.parse("https://www.gravatar.com/avatar/#{current_user.virtual_qr_code}.jpg?d=identicon"))
      puts result.inspect #=> Net::HTTPResponse object

      # result.body will return the actual content of the HTTP request, instead of the Net::HTTPResponse object.
      current_user.user_preference.identicon.attach(result.body)

评论

0赞 Jerome 12/30/2022
已经尝试过了,但是对结果的检查返回,因此ActiveStorage没有有效的东西可以处理。但是,删除输出选项并更改动词以检查似乎是图像对象的内容,然后在以下情况下出现错误:#<Net::HTTPOK 200 OK readbody=true>Could not find or build blob: expected attachable, got #<Net::HTTPOK 200 OK readbody=true>get"\x89PNG\r\n\x1A\n\x00\x00\x00\[...].attach(result)(ActiveSupport::MessageVerifier::InvalidSignature)
0赞 Jerome 12/30/2022
无效的签名意味着存在数据类型问题。返回的字符串必须处理 ' current_user.user_preference.identicon.attach( io: StringIO.new(result), filename: some_devised_file_name, content_type: 'image/jpeg' )'
0赞 Frederik Spang 12/30/2022
您必须获取 HTTP 请求的实际 HTTP 正文。我已经更新了我的答案.attach(result.body)
0赞 Jerome 12/31/2022
恐怕不是。 返回的结果是一个字符串,因此使用StringIO