문제

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
도움이 되었습니까?

해결책

그만큼 open 방법:

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

템 파일 객체를 반환하고 있습니다 encode64 문자열을 기대합니다.

부름 read Tempfile에서 트릭을 수행해야합니다.

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

다른 팁

파일을 인코딩하려면 :

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

이것도 효과가있을 것입니다. 조금 더 깨끗합니다.

 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 이전에 인코딩 된 파일 컨텐츠 리턴 값입니다.

파일을 Base64 인코딩으로 인코딩합니다.

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

Decode Base64 인코딩 된 파일 :

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

내 솔루션은 다음과 같습니다.

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 : 그런 다음 Vase64 인코딩 된 이미지를 사용하려는보기 내에서 다음과 같은 방법을 사용하려고합니다.

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

3 : 완료

다른 사람에게 유용한 경우 Base64로 스크린 샷을 저장하는 방법은 다음과 같습니다. Watir

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

이것의 아름다움은 이미지 자체를 저장할 필요가 없다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top