Вам не хватает «корневой» конфигурации / опций (я не знаю, так как я не использую Hanami).
Глядя на трассировку стека:
fetch
имеет псевдоним :[]
(все ссылки на последние, потому что я ленивый :))
Большинство форматов изображения указывает тип файла в первых нескольких байтах изображения. Можно читать в нескольких байтах и искать корректные заголовки.
Расширения файла технически не содержат важных данных об изображении. Это просто помогает фигуре ОС что программу использовать для открытия его. (Но, проверение extn является, вероятно, самым легким путем, и обычно исправляйте.)
Это не тестируется, но это - что-то вроде этого:
private string MimeType (string Filename)
{
string mime = "[default]";
string ext = GetExtension(Filename).ToLower();
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (rk != null && rk.GetValue("Content Type") != null)
mime = rk.GetValue("Content Type").ToString();
return mime;
}
(Извините, это было некоторое время, так как я сделал материал реестра),
Путем мы сделали это (и я не могу найти точный код прямо сейчас, таким образом, следующее не тестируется), должен попытаться загрузить изображение как битовый массив. Если это перестало работать, не изображение
bool isImage;
try
{
Bitmap.FromFile(filePath);
isImage = true;
}
catch
{
isImage = false;
}
Я не думаю, что существует любой способ гарантировать, что данный файл (или любой набор байтов) обязательно представляет изображение кроме попытки загрузить и отобразить его.
Однако, если у Вас есть некоторые таинственные байты, Вы могли бы всегда проверять на определенные подписи байта, чтобы попытаться вывести, если это - хорошо сформированный файл изображения. Вы можете искать заголовки файлов на Википедию, но здесь являетесь некоторым кодом, который я использую в поблочном тестировании для проверки вывода стороннего инструмента создания отчетов:
// Some signatures:
const string _pdfSignature = "%PDF-";
readonly byte[] _bmpSignature = new byte[2] { 0x42, 0x4D };
readonly byte[] _pngSignature = new byte[8] {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
readonly byte[] _gifSignature = new byte[6] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 };
И для JPGs:
Assert.That(_theBytes[0] == 0xFF && _theBytes[1] == 0xD8); //Start of jpg file
Assert.That(_theBytes[_theBytes.Length - 2] == 0xFF && _theBytes[_theBytes.Length - 1] == 0xD9); //End of jpg file
Если необходимо проверить это, файл является допустимым форматом изображения затем, Вы оказываетесь перед необходимостью иметь своего рода код, пытаются проанализировать содержание согласно типу файла, который Вы ожидаете. Чтобы сделать это, Вы назвали бы статический метод FromFile на классе Изображения, чтобы попытаться получить экземпляр Изображения.
Вы могли проверить первые несколько байтов, чтобы видеть, там ли маркер для конкретного формата изображения, но точно так же, как проверка расширения файла, он не гарантирует, что содержание является допустимым форматом изображения.
Если Вам не нужна проверка, хотя, проверяя расширение файла или имитируют тип, очень хорошо.
Большинство файлов изображений имеет волшебный байт или два в самом начале файла. Это используется декодерами и программами просмотра изображений для идентификации типа файла. Нет никакого правила, которое может помочь Вам.
По общему признанию я не сделал слишком много с этим, но это просто не ищет тип пантомимы?