Cómo codificar los medios en la base64 dada URL en Ruby

Estoy tratando de subir una imagen a PingFM. Su documentación dice:

media – base64 encoded media data. 

Puedo acceder a esta imagen a través de la URL. Intenté (prácticamente adiviné) esto:

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

Pero me sale este error:

 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 

El método open :

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

está devolviendo un objeto Tempfile, mientras que encode64 espera una cadena.

Llamar a read en el archivo temporal debería hacer el truco:

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

Para codificar un archivo:

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

Para producir el archivo de la cadena codificada:

 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 

Esto funcionará también, es un poco más limpio.

  require 'base64' Base64.encode64(open("file_path").to_a.join) 

“¿Cómo se decodifica esto de nuevo en un archivo?” – @ user94154

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

Donde encoded_content sería el valor de retorno del contenido del archivo codificado previamente.

Codifica un archivo para codificar en base64:

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

Decodificar el archivo codificado en base64:

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

Aquí está mi solución:

1: ponga este método de etiqueta de imagen personalizado en ApplicationHelper e incluya el módulo 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: Luego, dentro de la vista que desea utilizar la imagen codificada en base64, utilice el método de esta manera:

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

3: HECHO