2009-07-21 30 views
40

Tôi đang tích hợp ứng dụng Ruby on Rails với hệ thống vận chuyển usps. Khi bạn thực hiện yêu cầu bưu chính, bạn thanh toán cho bưu phí đó và không thể hoàn lại tiền.Cách lưu chuỗi base64 dưới dạng hình ảnh sử dụng ruby ​​

Yêu cầu bưu chính sẽ trả lại cho bạn phản hồi xml bao gồm chuỗi base64, là nhãn vận chuyển.

Tôi có thể hiển thị nhãn gửi hàng trong chế độ xem, tuy nhiên để làm cho nó trở nên dễ dàng, tôi muốn có thể lưu chuỗi base64 đó làm hình ảnh trên máy chủ của tôi trong trường hợp xảy ra sự cố với nhãn vận chuyển giữa thế hệ (thanh toán cho nó) và gửi thư để nó có thể được in lại mà không cần mua một cái mới.

suy nghĩ đầu tiên của tôi là như sau

# 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)) 
} 

Không làm việc.

Trả lời

77

Khi ghi dữ liệu nhị phân vào một tệp, chẳng hạn như trường hợp có hình ảnh, việc sử dụng IO # đặt là nguy hiểm và tránh được tốt nhất. Bạn nên viết ở chế độ nhị phân, phần lớn không liên quan trên các nền tảng chỉ có LF như UNIX hoặc OS X, nhưng là bắt buộc đối với các CRLF như Windows. IO # đặt cũng nối thêm một dòng mới ở phần cuối của tệp không hợp lệ.

Cách tiếp cận tốt nhất là phải xác định đúng cờ trên các cuộc gọi mở:

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

Ví dụ, xem comment trên # trang tài liệu mở IO:

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

+1

Công việc này hoàn hảo. Cảm ơn vì những lời giải thích và liên kết. – Ricky

1

Nếu bạn cần phải viết nó vào một hình ảnh sau đó sử dụng imagemagick thông qua đá quý rmagick.

http://rmagick.rubyforge.org/

+3

Tôi có thể làm như thế nào? – 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) 

Sau khi bạn sử dụng hình ảnh kan như tập tin Photo.new (ảnh: hình ảnh) #save useng kẹp giấy trong mô hình Ảnh

10

câu trả lời khác là khá chặt chẽ, nhưng thường giả định rằng base64 luồng sẽ chứa dữ liệu PNG. Đây không phải lúc nào cũng như vậy nên tôi khuyên bạn nên sử dụng thư viện kiểu mime để thiết lập phần mở rộng tệp chính xác:

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 
Các vấn đề liên quan