如何在 Ruby 中给定 URL 以 base64 编码媒体

Posted

技术标签:

【中文标题】如何在 Ruby 中给定 URL 以 base64 编码媒体【英文标题】:How to encode media in base64 given URL in Ruby 【发布时间】:2010-12-05 13:02:29 【问题描述】:

我正在尝试将图像上传到 PingFM。他们的documentation 说:

media – base64 encoded media data.

我可以通过 URL 访问此图像。我试过(几乎猜到了)这个:

ActiveSupport::Base64.encode64(open("http://image.com/img.jpg"))

但我收到此错误:

TypeError: can't convert Tempfile into String
    from /usr/lib/ruby/1.8/base64.rb:97:in `pack'
    from /usr/lib/ruby/1.8/base64.rb:97:in `encode64'
    from (irb):19
    from :0

【问题讨论】:

我看到了两个答案!我无法让 khell's 工作,因为我怀疑我不太了解它。我选择 mtyaka 是因为像我这样的菜鸟可以很容易地理解它。谢谢你们! 我知道我在评论一个死问题。但是,当您从数据库中处理 base64 编码媒体数据时,请确保它已被清理,或者您构建了一个可注入的网络应用程序。 【参考方案1】:

如果它对其他人有用,这里是如何使用Watir将屏幕截图保存为base64

browser = Watir::Browser.new(:chrome, :chromeOptions => :args => ['--headless', '--window-size=1000x1000'])
browser.goto("http://www.yourimage.com")
browser.screenshot.base64

这样做的好处是您不需要存储图像本身

【讨论】:

【参考方案2】:

这是我的解决方案:

1:将此自定义image_tag方法放入ApplicationHelper中,并包含ActiveSupport模块

module ApplicationHelper
  include ActiveSupport
  def image_tag_base64(file_path, mime_type = 'image/jpeg', options = )
    image_tag("data:#mime_type;base64,#Base64.encode64(open(file_path)  |io| io.read )", options)
  end
end

2:然后,在要使用base64编码图像的视图中使用如下方法:

<%= image_tag_base64 @model.paperclip_attribute.path(:size), @model.paperclip_attribute.content_type, class: 'responsive-img etc etc' %>

3:完成

【讨论】:

【参考方案3】:

这也行,它更干净一点

 require 'base64'

 Base64.encode64(open("file_path").to_a.join)

“如何将其解码回文件?” - @user94154

 require 'base64'

 open('output_file_name.txt', 'w') do |f| 
   f << Base64.decode64( encoded_content )
 end

encoded_content 是之前编码的文件内容返回值。

【讨论】:

这个答案对更高版本的 Rails 无效,因为它在 3.2.13 版之后被删除,如 docs 中所述。 谢谢@RoopeHakulinen!答案已更新为仅使用 ruby​​ 的 Base64 实现。【参考方案4】:

对文件进行编码:

require 'base64'
Base64.encode64(File.open("file_path", "rb").read)

从编码字符串生成文件:

require 'base64'
encoded_string = Base64.encode64(File.open("file_path", "rb").read)

File.open(file_name_to_create, "wb") do |file|
    file.write(Base64.decode64(encoded_string))
end

【讨论】:

rails 4.0.1 // 实际上,作为 ActiveSupport::Base64 工作的那个会返回一个未初始化的常量,即使在 Rails 应用程序(控制台)中也是如此 这应该是最佳答案。无需任何宝石即可直接使用 ruby​​ irb。 (在 ruby​​ 2.0.0-p481 上测试) 有效。没有 ActiveSupport。对我来说,有必要在 File.open 中使用“rb”。 第二个参数 open ("rb") 的作用是什么? @meetalexjohnson 其文件打开模式。 rbread as binary。您也可以查看其他模式的文档【参考方案5】:

open 方法:

open("http://image.com/img.jpg")

正在返回一个 Tempfile 对象,而 encode64 需要一个字符串。

在临时文件上调用 read 应该可以解决问题:

ActiveSupport::Base64.encode64(open("http://image.com/img.jpg")  |io| io.read )

【讨论】:

请不要只 .read,它会使文件描述符保持打开状态。在 1.9 上,我认为使用 ActiveSupport,您可以 open(url, &:read),它将使用块形式并在完成读取时关闭文件句柄。在原版 1.8 上,使用 open(url)|io| io.read 代替。 @manveru 对。感谢您的评论 - 我更新了答案。 谢谢,为我工作,但重要提示:您首先需要要求“open-uri”。 :D 你可以这样做:ActiveSupport::Base64.encode64( open("http://image.com/img.jpg").read),你想在最后做:....g.jpg")read).gsub("\n", '')【参考方案6】:

将文件编码为base64编码:

File.open("output_file","w")|file| file.write [open("link_to_file").string].pack("m")

解码base64编码文件:

File.open('original', 'wb') |file| file << (IO.readlines('output_file').to_s.unpack('m')).first 

【讨论】:

在我的情况下(ruby 2.0.0p481),open("filename").string 失败并出现 NoMethodError: undefined method `string' for #

以上是关于如何在 Ruby 中给定 URL 以 base64 编码媒体的主要内容,如果未能解决你的问题,请参考以下文章

Base64和Base64Url

如何在 ASP.NET 中将 base64 图像 URL 转换为用户友好 URL

如何将 URL 从 Webapi 传递到 <img> 标签以接受 base64 的图像?

如何在python中解码base64 url​​?

如何在 C# 中实现 Base64 URL 安全编码?

如何在 iOS 字符串中禁用或绕过 Base64 图像 url 数据的转义序列