Ruby on rails 是否有一种方法可以将二进制数据转换为数据类型,从而允许ActiveStorage将其作为映像附加到我的用户模型

Ruby on rails 是否有一种方法可以将二进制数据转换为数据类型,从而允许ActiveStorage将其作为映像附加到我的用户模型,ruby-on-rails,imagemagick,jpeg,binary-data,rails-activestorage,Ruby On Rails,Imagemagick,Jpeg,Binary Data,Rails Activestorage,我点击一个api来获取他们存储的图像,并将其用作我们应用程序用户的配置文件图片。我正在使用RubyonRails和ActiveStorage以及AWS来附加和存储图像。他们返回的是: {"status"=>"shared", "values"=>[{"$objectType"=>"BinaryData", "data"=>"/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAAT.....KK5tT/9k=", "mime_type"=>"

我点击一个api来获取他们存储的图像,并将其用作我们应用程序用户的配置文件图片。我正在使用RubyonRails和ActiveStorage以及AWS来附加和存储图像。他们返回的是:

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

我还尝试:

user.profile_pic.attach(out_file)
它不断地说附件为零,或者取决于我如何操作数据,它会说不是jpeg文件内容头类型错误,并将其作为图像magick错误抛出


如何操作此数据,以便能够将其作为图像附加到使用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


很抱歉,我不知道RMagick中的等效项要使其正常工作,我必须将
gem“mini_magick”
添加到我的gem文件中,然后使用它对从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"
)

谢谢RMagick工作不太好,所以我正在尝试mini_magick。我正在尝试这样的东西
image=MiniMagick::image.read(“内联:数据:image/jpeg;base64,”+响应[:selfie_image][“value”][0][“data”])
然后用ActiveRecord附加图像,但它给了我一个错误:`Identification/var/folders/f5/20y48_ld2jg2jhzf1lrjx41r0000gn/T/mini_magick20190421-52156-akywdw`失败,错误:Identification:此图像格式没有解码委托
'@error/compose.c/ReadImage/512。
抱歉,希望我能提供更多帮助。我既不知道RMagick也不知道mini_magick。您是否尝试过使用命令行测试ImageMagick是否会按照我的示例处理base64数据?如果这样做有效,那么请尝试将数据直接放入命令中,以确保它不是您检索数据的方式。否则,也许您应该直接询问RMagick和mini_magick开发人员,看看他们是否支持内联:谢谢,在您的资源帮助下,我能够找到答案。
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"
)