web-dev-qa-db-fra.com

Comment encoder un média en base64 avec une URL en Ruby

J'essaie de télécharger une image sur PingFM. Leur documentation dit:

media – base64 encoded media data.

Je peux accéder à cette image via l'URL. J'ai essayé (pratiquement deviné) ceci:

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

Mais je reçois cette erreur:

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
45
Ramon Tayag

La méthode open:

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

renvoie un objet Tempfile, alors que encode64 attend une chaîne.

Appeler read sur le fichier temporaire devrait faire l'affaire:

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

Pour encoder un fichier:

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

Pour produire le fichier à partir de la chaîne encodée:

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
71
Marielyn Alvarado

Cela fonctionnera aussi, c'est un peu plus propre

 require 'base64'

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

"Comment décryptez-vous cela dans un fichier?" - @ user94154

 require 'base64'

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

encoded_content serait la valeur de retour du contenu du fichier précédemment codé.

19
robertodecurnex

Encoder un fichier en encodage base64:

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

Décoder le fichier encodé en base64:

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

Voici ma solution:

1: Placez cette méthode image_tag personnalisée dans ApplicationHelper et incluez le module 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: Ensuite, dans la vue que vous voulez utiliser une image codée en base64, utilisez la méthode suivante:

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

3: FAIT

2
mld.oscar

Si cela est utile aux autres, voici comment enregistrer une capture d'écran en base64 avec Watir

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

La beauté de ceci est que vous n'avez pas besoin de stocker l'image elle-même

0
user5783745