A pretty much line-for-line port of https://github.com/sindresorhus/file-type Many thanks to Sindre Sorhus for putting this together.

The module has two methods: detect and read_and_detect. The former works on String objects (when you already read stuff), the latter works on IO objects (or anything you can #read from).

file_type = File.open('suspicious_file.bin', 'rb') do |f
  MagicBytes.read_and_detect(f)
end
file_type.ext #=> 'msi', someone is uploading a Windows installer...

If the file type is unknown, the last-resort variant of bin as extension and binary/octet-stream will be returned.