提问人:Jerome 提问时间:12/30/2022 更新时间:12/30/2022 访问量:40
将 gravatar 保存到 activeStorage
saving a gravatar to activeStorage
问:
控制台中的以下 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 保存?
答:
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
评论