Ale*_*lez 5 jpeg ruby-on-rails imagemagick binary-data rails-activestorage
我正在使用 api 来获取他们存储的图像,并将其用作我们应用程序用户的个人资料图片。我使用 Ruby on Rails 和 ActiveStorage 与 AWS 来附加和存储图像。他们发回的内容是这样的:
{"status"=>"shared", "values"=>[{"$objectType"=>"BinaryData", "data"=>"/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAAT.....KK5tT/9k=", "mime_type"=>"image/jpeg", "metadata"=>{"cropped"=>false}}]}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的方法来附加它并操作数据,例如直接附加它,Base64.decode64,Base64.encode64。我还尝试创建一个新文件然后附加它。这里有些例子:
data = Base64.decode64(Base64.encode64(response[:selfie_image]["values"][0]["data"]))
user.profile_pic.attach!(
io: StringIO.new(open(data).read),
filename: "#{user.first_name}_#{user.last_name}_#{user.id}.jpg",
content_type: "image/jpeg"
)
Run Code Online (Sandbox Code Playgroud)
data = Base64.decode64(Base64.encode64(response[:selfie_image]["values"][0]["data"]))
out_file = File.new("#{user.first_name}_#{user.last_name}_# . {user.id}.jpg", "w")
out_file.puts(data)
out_file.close
user.profile_pic.attach(
io: StringIO.new(open(out_file).read),
filename: "#{user.first_name}_#{user.last_name}_#{user.id}.jpg",
content_type: "image/jpeg"
)
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
user.profile_pic.attach(out_file)
Run Code Online (Sandbox Code Playgroud)
它要么一直说附件为零,要么根据我操作数据的方式,它会说不是 jpeg 文件内容头类型错误并将其作为图像魔法错误抛出。
我如何操作这些数据,以便能够使用 ActiveStorage 将其作为图像附加给我们的用户?
为了让它工作,我必须添加gem "mini_magick"到我的 gemfile 中,然后用它来解码我从 api 调用接收到的图像数据,然后将其转换为 blob,以便 ActiveStorage 可以处理它。
data = response[:selfie_image]["values"][0]["data"]
decoded_data = Base64.decode64(data)
image = MiniMagick::Image.read(decoded_data)
image.format("png")
user.profile_pic.attach(
io: StringIO.new(image.to_blob),
filename: "#{user.id}_#{user.first_name}_#{user.last_name}.png",
content_type: "image/jpeg"
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2044 次 |
| 最近记录: |