Вы можете декодировать необработанные байты, используя одну из различных библиотек ImageMagick, а затем запросить формат в ImageMagick. Например, с RMagick :
require 'rmagick'
bytes = ActiveSupport::Base64.decode64(params[:image])
img = Magick::Image.from_blob(bytes).first
fmt = img.format
Это даст вам 'PNG'
, 'JPEG'
и т. Д. В fmt
. ImageMagick проверяет байты на наличие магических чисел и другой идентифицирующей информации, поэтому ему не нужно имя файла, чтобы узнать, какое изображение вы ему даете.
Что касается имени файла, вам не повезло, если кто-то явно не скажет вам, что это такое. Имя файла в любом случае редко имеет значение, и вы должны никогда использовать имя файла, которое вы не сгенерировали, для сохранения чего-либо; пользовательское имя файла должно использоваться только для отображения имени людям, составьте свое собственное имя файла (которое, как вы знаете, безопасно), если оно вам нужно.