【问题标题】:How to save a base64 string as an image using ruby如何使用 ruby​​ 将 base64 字符串保存为图像
【发布时间】:2009-07-21 18:02:52
【问题描述】:

我正在将我的 Ruby on Rails 应用程序与 usps 运输系统集成。一旦您提出邮资请求,您就需要支付该邮资并且不可退还。

邮资请求将返回一个 xml 响应,其中包括一个 base64 字符串,即运输标签。

我可以在视图中呈现运输标签,但是为了确保万无一失,我希望能够将该 base64 字符串作为图像保存在我的服务器上,以防两者之间的运输标签发生问题代(付费)并邮寄,因此无需购买新的即可重印。

我最初的想法如下

# Attempt 1
File.open('shipping_label.gif', 'w+') {|f|
    f.puts Base64.decode64(base_64_encoded_data)
}

# Attempt 2
File.open('shipping_label.gif', 'w+') {|f|
    f.puts Base64.decode64(Base64.decode64(base_64_encoded_data))
}

都不行。

【问题讨论】:

    标签: ruby-on-rails ruby image file-io base64


    【解决方案1】:

    将二进制数据写入文件时,例如图像的情况,您不能使用像IO#puts 这样的文本打印工具。

    您需要确保两件事:

    • 您需要以二进制模式写入以避免任何可能的 LF 到 CRLF 扩展。
    • 您必须使用write 而不是puts,因为write 可以处理任意数据,但puts(字面意思是“放置字符串”)专门用于文本。

    结合这些你得到:

    File.open('shipping_label.gif', 'wb') do |f|
      f.write(Base64.decode64(base_64_encoded_data))
    end
    

    【讨论】:

    • 这项工作非常完美。感谢您的解释和链接。
    • @AhmedSalah 不确定你的意思。这应该仍然适用于 base64 编码的数据。
    • @tadman 我正在尝试保存 PNG 图像,但图像文件已损坏,前图像查看器说“读取 PNG 图像文件的致命错误:不是 PNG 文件”我也有类似的 Q 这里@ 987654321@
    【解决方案2】:

    其他答案非常接近,但通常假设 base64 流将包含 PNG 数据。情况并非总是如此,因此我建议使用 mime 类型库来建立正确的文件扩展名:

    REGEXP = /\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m
    
    data_uri_parts = data_url.match(REGEXP) || []
    extension = MIME::Types[data_uri_parts[1]].first.preferred_extension
    file_name = "myfilename.#{extension}"
    
    File.open(file_name, 'wb') do |file|
        file.write(Base64.decode64(data_uri_parts[2]))
    end
    

    【讨论】:

    • REGEXP = /\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m SyntaxError Exception: (byebug) :1: 未终止的正则表达式遇到文件结尾 ...= /\Adata:([-\w]+\/[-\w\+\.]+)?
    【解决方案3】:
    data = params[:image_text]# code like this  data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABPUAAAI9CAYAAABSTE0XAAAgAElEQVR4Xuy9SXPjytKm6ZwnUbNyHs7Jc7/VV9bW1WXWi9q
    image_data = Base64.decode64(data['data:image/png;base64,'.length .. -1])
    new_file=File.new("somefilename.png", 'wb')
    new_file.write(image_data)
    

    可以将图像用作文件后 Photo.new(image: image)#在照片模型中使用回形针保存

    【讨论】:

    • 为什么需要“RMagick”?其余的解决方案不使用它
    • 这是我需要的。
    【解决方案4】:

    如果您需要将其写入图像,请通过 rmagick gem 使用 imagemagick。

    http://rmagick.rubyforge.org/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2015-05-04
      • 2011-02-16
      • 2011-09-03
      相关资源
      最近更新 更多