Как сохранить строку base64 как изображение с помощью ruby
Я интегрирую свое приложение Ruby on Rails с системой доставки usps. Как только вы делаете почтовый запрос, вы платите за эту почтовую рассылку, и она не возвращается.
Почтовые запросы возвратят вам ответ xml, включая строку base64, которая является ярлыком доставки.
Я могу отобразить метку доставки в представлении, однако, чтобы сделать ее надежной, я хотел бы сохранить эту строку 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))
}
Ни одна из них не работает.
Ответы
Ответ 1
При записи двоичных данных в файл, например, с изображением, использование IO # puts опасно и лучше всего избегать. Вы должны писать в двоичном режиме, что в основном не имеет отношения к платформам LF, таким как UNIX или OS X, но обязательно для CRLF, таких как Windows. IO # puts также добавляет новую строку в конце недопустимого файла.
Лучший подход - указать правильный флаг при открытом вызове:
File.open('shipping_label.gif', 'wb') do|f|
f.write(Base64.decode64(base_64_encoded_data))
end
Например, см. комментарий на открытой странице документации IO #:
http://apidock.com/ruby/IO/open/class
Ответ 2
Другие ответы довольно близки, но обычно предполагают, что поток base64 будет содержать данные PNG. Это не всегда так, поэтому я предлагаю использовать библиотеку типов mime для установки правильного расширения файла:
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
Ответ 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 paperclip в Фотомодели
Ответ 4
Если вам нужно записать его на изображение, используйте imagemagick через драгоценный камень rmagick.
http://rmagick.rubyforge.org/