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

Ram*_*yag 50 ruby base64 encode ruby-on-rails activesupport

我正在尝试将图像上传到PingFM.他们的文件说:

media – base64 encoded media data.
Run Code Online (Sandbox Code Playgroud)

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

ActiveSupport::Base64.encode64(open("http://image.com/img.jpg"))
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

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
Run Code Online (Sandbox Code Playgroud)

小智 78

要编码文件:

require 'base64'
Base64.encode64(File.open("file_path", "rb").read)
Run Code Online (Sandbox Code Playgroud)

要从编码的字符串生成文件:

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
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最佳答案.没有任何宝石,直接来自红宝石irb.(在ruby 2.0.0-p481上测试) (4认同)

mty*_*aka 50

open方法:

open("http://image.com/img.jpg")
Run Code Online (Sandbox Code Playgroud)

正在返回一个Tempfile对象,同时encode64需要一个String.

调用readtempfile应该可以解决问题:

ActiveSupport::Base64.encode64(open("http://image.com/img.jpg") { |io| io.read })
Run Code Online (Sandbox Code Playgroud)

  • 请不要只是.read,它将保持文件描述符打开.在1.9上,我认为使用ActiveSupport,你可以打开(url,&:read),它将使用块形式并在完成读取时关闭文件句柄.在vanilla 1.8上,使用open(url){| io | 相反,io.read}. (5认同)

rob*_*nex 19

这也会起作用,它有点清洁

 require 'base64'

 Base64.encode64(open("file_path").to_a.join)
Run Code Online (Sandbox Code Playgroud)

"你如何将其解码回文件?" - @ user94154

 require 'base64'

 open('output_file_name.txt', 'w') do |f| 
   f << Base64.decode64( encoded_content )
 end
Run Code Online (Sandbox Code Playgroud)

encoded_content以前编码的文件内容返回值在哪里?


khe*_*lll 11

将文件编码为base64编码:

File.open("output_file","w"){|file| file.write [open("link_to_file").string].pack("m")}
Run Code Online (Sandbox Code Playgroud)

解码base64编码文件:

File.open('original', 'wb') {|file| file << (IO.readlines('output_file').to_s.unpack('m')).first }
Run Code Online (Sandbox Code Playgroud)


mld*_*car 5

这是我的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

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

<%= image_tag_base64 @model.paperclip_attribute.path(:size), @model.paperclip_attribute.content_type, {class: 'responsive-img etc etc'} %>
Run Code Online (Sandbox Code Playgroud)

3:完成