2009-07-21 5 views
40

Ruby on Rails 앱을 usps 배송 시스템과 통합합니다. 우송 요청을하면 해당 우송료를 지불하고 환불되지 않습니다.ruby를 사용하여 base64 문자열을 이미지로 저장하는 방법

배송비 요청은 배송 라벨 인 base64 문자열을 포함하여 xml 응답을 반환합니다.

보기에서 배송 라벨을 렌더링 할 수 있지만 배송비 라벨에 문제가 발생하면 서버에서 이미지로 base64 문자열을 저장할 수 있기를 바랍니다. 세대 (지불)와 메일 링 사이에서 새로운 것을 사지 않고도 다시 인쇄 할 수 있습니다.

# Attempt 1 
File.open('shipping_label.gif', 'w+') {|f| 
    f.puts Base64.decode64(base_64_encoded_data) 
} 

# Attempt 2 
File.open('shipping_label.gif', 'w+') {|f| 
    f.puts Base64.decode64(Base64.decode64(base_64_encoded_data)) 
} 

어느 일을 다음과 같이

내 첫번째 생각이었다.

답변

77

이미지와 같이 파일에 이진 데이터를 쓰는 경우 IO # puts를 사용하면 위험하므로 피해야합니다. UNIX 나 OS X와 ​​같은 LF 전용 플랫폼에서는 대부분 관련성이없는 바이너리 모드로 작성해야하지만 Windows와 같은 CRLF에서는 필수적입니다. IO # puts는 또한 파일 끝에 유효하지 않은 줄 바꿈을 추가합니다. 예를 들어,

File.open('shipping_label.gif', 'wb') do|f| 
    f.write(Base64.decode64(base_64_encoded_data)) 
end 

입출력 # 열려있는 문서 페이지에 주석을 참조하십시오 :

http://apidock.com/ruby/IO/open/class

+1

: 나는 올바른 파일 확장자를 설정하는 마임 타입 라이브러리를 사용하는 것이 좋습니다 그래서이 항상 그런 것은 아니다. 설명과 링크에 감사드립니다. – Ricky

1

당신이 만약을

가장 좋은 방법은 공모에 올바른 플래그를 지정하는 것입니다 그것을 이미지에 쓰고 rmagick gem을 통해 imagemagick을 사용해야합니다.

http://rmagick.rubyforge.org/

+3

어떻게 할 수 있습니까? – juanpastas

3
require 'RMagick' 
data = params[:image_text]# code like this data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABPUAAAI9CAYAAABSTE0XAAAgAElEQVR4Xuy9SXPjytKm6ZwnUbNyHs7Jc7/VV9bW1WXWi9q 
image_data = Base64.decode64(data['data:image/png;base64,'.length .. -1]) 
new_file=File.new("somefilename.png", 'wb') 
new_file.write(image_data) 

파일 Photo.new (이미지 : 이미지)와 같이 관 이미지 사용 후 사진 모델 #save의 useng의 클립

10

다른 대답은 아주 가까이 있지만, 일반적으로 그 Base64로 가정 스트림에는 PNG 데이터가 포함됩니다. 이 작품의 완벽

REGEXP = /\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m 

data_uri_parts = data_url.match(REGEXP) || [] 
extension = MIME::Types[data_uri_parts[1]].first.preferred_extension 
file_name = "myfilename.#{extension}" 

File.open(file_name, 'wb') do |file| 
    file.write(Base64.decode64(data_uri_parts[2])) 
end 
관련 문제