我正在尝试将图片上传到PingFM。他们的documentation说:
media – base64 encoded media data.
我可以通过网址访问此图片。我试过(几乎猜到了)这个:
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
答案 0 :(得分:75)
编码文件:
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
答案 1 :(得分:49)
open
方法:
open("http://image.com/img.jpg")
返回一个Tempfile对象,而encode64
需要一个String。
在tempfile上调用read
应该可以解决问题:
ActiveSupport::Base64.encode64(open("http://image.com/img.jpg") { |io| io.read })
答案 2 :(得分:19)
这也会起作用,它更清洁
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
将是先前编码的文件内容返回值。
答案 3 :(得分:11)
将文件编码为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 }
答案 4 :(得分:2)
这是我的解决方案:
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:完成
答案 5 :(得分:0)
如果对其他人有用,请按照以下步骤使用Watir
browser = Watir::Browser.new(:chrome, {:chromeOptions => {:args => ['--headless', '--window-size=1000x1000']}})
browser.goto("http://www.yourimage.com")
browser.screenshot.base64
这样做的好处是您不需要存储图像本身