有没有办法将二进制数据转换为允许 ActiveStorage 将其作为图像附加到我的用户模型的数据类型

Is there a way to convert binary data into a data type that will allow ActiveStorage to attach it as an image to my User model

我正在点击 api 以获取他们存储的图像并将其用作我们应用程序用户的个人资料图片。我在 Rails 上使用 Ruby 并在 AWS 上使用 ActiveStorage 来附加和存储图像。他们发回的是这样的:

{"status"=>"shared", "values"=>[{"$objectType"=>"BinaryData", "data"=>"/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAAT.....KK5tT/9k=", "mime_type"=>"image/jpeg", "metadata"=>{"cropped"=>false}}]}

我尝试了很多不同的方法来附加它和操作数据,例如按原样附加它,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"
)

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"
)

我也试过:

user.profile_pic.attach(out_file)

它一直说附件为零,或者根据我处理数据的方式,它会说不是 jpeg 文件内容 header 输入错误并将其作为图像魔术错误抛出。

我如何操作这些数据才能将其作为图像附加到我们的 ActiveStorage 用户?

在命令行 ImageMagick 中,您可以使用 inline: 功能将 base64 数据解码为 gif 或 jpg。这里的base64图片是有透明度的,保存成gif或者png最合适

convert 'inline:data:image/gif;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
'  b64_noseguy.gif


但您仍然可以将其保存为 jpg。透明度会丢失,背景会变黑。

convert 'inline:data:image/jpeg;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
'  b64_noseguy.jpg


https://imagemagick.org/Usage/files/#inline

抱歉,我不知道 RMagick 中的等价物

为了让它工作,我必须将 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"
)