ruby on rails - Cómo codificar medios en base64 URL dada en Ruby
ruby-on-rails encode (5)
Estoy intentando subir una imagen a PingFM. Su documentation 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
Aquí está mi solución:
1: Ponga este método personalizado image_tag 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 usar la imagen codificada en base64, use 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
Codifique un archivo a la codificación base64:
File.open("output_file","w"){|file| file.write [open("link_to_file").string].pack("m")}
Decodificar el archivo codificado base64:
File.open(''original'', ''wb'') {|file| file << (IO.readlines(''output_file'').to_s.unpack(''m'')).first }
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 ser el truco:
ActiveSupport::Base64.encode64(open("http://image.com/img.jpg") { |io| io.read })
Esto también funcionará, es un poco más limpio
require ''base64''
Base64.encode64(open("file_path").to_a.join)
"¿Cómo descifras esto 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 previamente codificado.
Para codificar un archivo:
require ''base64''
Base64.encode64(File.open("file_path", "rb").read)
Para producir el archivo a partir 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