2009-10-10 61 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

相關問題