Как кодировать медиа в base64 по заданному URL в Ruby - PullRequest
50 голосов
/ 10 октября 2009

Я пытаюсь загрузить изображение в PingFM. Их документация гласит:

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

Ответы [ 6 ]

77 голосов
/ 22 сентября 2011

Для кодирования файла:

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
50 голосов
/ 10 октября 2009

Метод open:

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

возвращает объект Tempfile, а encode64 ожидает строку.

Вызов read в временном файле должен помочь:

ActiveSupport::Base64.encode64(open("http://image.com/img.jpg") { |io| io.read })
19 голосов
/ 21 декабря 2010

Это тоже будет работать, немного чище

 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 будет возвращаемым ранее значением содержимого файла.

11 голосов
/ 10 октября 2009

Кодирование файла в кодировку 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 }
2 голосов
/ 28 августа 2017

Вот мое решение:

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: СДЕЛАНО

0 голосов
/ 09 января 2019

Если это полезно для других, вот как сохранить скриншот как base64, используя Watir

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

Прелесть этого в том, что вам не нужно хранить само изображение

...