2009-10-10 72 views
37

我试图将图像上传到PingFM。他们的documentation说:如何在base64中对媒体进行编码给定的URL在Ruby中

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 
+0

我看到了两个答案!我不能让khelll工作,因为我怀疑我的理解不够。我选择mtyaka的是因为像我这样的noobs可以很容易地理解它。 感谢你们俩! – 2009-10-11 16:08:58

+1

我知道我在评论一个死亡问题。但是,当你从数据库中处理base64编码媒体数据时,确保它已经过清理,或者您构建了一个可注入的Web应用程序。 – RobotHumans 2011-03-18 05:42:08

回答

44

The open方法:

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

返回一个将它视为对象,而encode64期望的字符串。

呼吁临时文件read应该做的伎俩:

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

或.string应该也可以。 – khelll 2009-10-10 13:36:18

+5

请不要只读。它会保持文件描述符打开。 在1.9上,我想用ActiveSupport,你可以打开(url,&:read),它将使用块表单并在完成阅读时关闭文件句柄。 在香草1.8上,使用open(url){| io |而不是io.read}。 – manveru 2010-03-09 09:43:28

+0

@manveru对。感谢评论 - 我更新了答案。 – mtyaka 2010-03-09 10:50:11

10

编码文件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 } 
+0

在我的情况下(ruby 2.0.0p481),'open(“filename”)。字符串失败* NoMethodError:未定义的方法'字符串'为#<文件:文件名> * – amenthes 2014-07-30 10:03:33

18

这也可以工作,这是一个有点清洁

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将先前编码的文件内容返回值。

+0

如何将其解码为文件? – user94154 2011-07-16 16:08:49

+1

@ user94154该代码已被添加到响应中 – robertodecurnex 2011-07-18 15:24:00

+0

此答案无效针对Rails的更高版本,因为它已经在[docs](http://apidock.com/rails/ActiveSupport/Base64/encode64s/class)中声明的版本3.2.13之后被移除了。 – 2016-07-18 10:05:20

62

对文件进行编码:

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 
+0

rails 4.0.1 //实际上,作为ActiveSupport :: Base64工作的那个会返回一个未初始化的常量,即使在rails应用程序(控制台)中也是如此 – Ben 2014-05-08 16:09:37

+4

这应该是最佳答案。没有任何宝石,直接从ruby irb下载(在ruby 2.0.0-p481上测试) – amenthes 2014-07-30 10:08:09

+0

作品。没有ActiveSupport。对我来说,有必要在File.open中使用'rb'。 – Evmorov 2015-08-27 12:09:54

1

这里是我的解决方案:

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:DONE

相关问题