Який найкращий спосіб визначити, чи файл - це зображення в PHP?

Я маю певну кількість людей, які можуть завантажувати файли на. Проблема полягає в тому, що деякі імена файлів махнули (у вас немає розширення), і тому я не можу негайно визначити тип файлу. Це питання складається з двох частин: для файлів, які мають назви файлів, який найкращий спосіб визначити, чи є це зображення? (Просто великий довгий/якщо інший список?) По-друге, для файлів, які не мають розширень, як я можу визначити, чи вони зображення?

2
PHP "> stackoverflow.com/questions/676949/…
додано Автор Mob, джерело
mime_content_type ()
додано Автор user557846, джерело

12 Відповіді

You can use exif_imagetype()

<?php
    $type =exif_imagetype($image);

де $ тип - значення

  1. IMAGETYPE_GIF
  2. IMAGETYPE_JPEG
  3. IMAGETYPE_PNG
  4. IMAGETYPE_SWF
  5. IMAGETYPE_PSD
  6. IMAGETYPE_BMP
  7. IMAGETYPE_TIFF_II (порядок байтів Intel)
  8. IMAGETYPE_TIFF_MM (замовлення байтів Motorola)
  9. IMAGETYPE_JPC
  10. IMAGETYPE_JP2
  11. IMAGETYPE_JPX
  12. IMAGETYPE_JB2
  13. IMAGETYPE_SWC
  14. IMAGETYPE_IFF
  15. IMAGETYPE_WBMP
  16. IMAGETYPE_XBM
  17. IMAGETYPE_ICO

З посібника:

Коли буде знайдено правильний підпис, буде повернуто відповідне константне значення, в іншому випадку повернення значення буде НЕЗНАЧЕНО. Повертає значення - те ж значення, яке getimagesize() повертає в індекс 2, але exif_imagetype() набагато швидше.

5
додано
Це також викидає помилку: "Прочитайте помилку!"
додано Автор chacham15, джерело
У PHP ви можете придушити повідомлення про помилки з @: @exif_imagetype ()
додано Автор macjohn, джерело

You can use getimagesize It does not require the GD image library and it returns same information about image type. http://it2.php.net/manual/en/function.getimagesize.php

4
додано
це призведе до помилки, якщо це не зображення
додано Автор chacham15, джерело
@chacham - Це не помилка, це лише попередження. Функція повертає false, якщо файл недійсний, слід перевірити за допомогою getimagesize ($ filename) === false .
додано Автор martinstoeckli, джерело
Ви можете використовувати @getimagesize ('ім'я-файлу'), щоб придушити WARNING для файлу без образу
додано Автор InuYaksa, джерело

У вас є два варіанти, прості і попередньо побудовані з деякими недоліками, інша складна і вимагає математики.

PHP's fileinfo can be used to detect file types based on the file's actual header information. For instance, I just grabbed your gravitar:

enter image description here

Але фактичний код такий:

‰PNG


IHDR  szzô
IDATX…­—OL\UÆZÀhëT)¡    c•1T:1‘Š‘.Ú(]4†A“ÒEY˜à.................................

Отже, навіть без імені файлу я міг це виявити досить очевидно. Ось що буде робити розширення PHP Fileinfo. Більшість файлів PNG та JPG, як правило, мають в них цей заголовок, але це не так для кожного типу файлів.

Як кажуть, файлова інформація мертва проста у використанні, з інструкції:

$fi = new finfo(FILEINFO_MIME,'/usr/share/file/magic');
$mime_type = $fi->buffer(file_get_contents($file));

Ваш інший варіант складніший і залежить від ваших особистих амбіцій, ви можете створити гістограму та файли профілю на основі їх вмісту .

Щось подібне виглядає як файл GIF:

enter image description here

І щось на зразок виглядає як файл TIFF:

enter image description here

Звідси ви повинні створити модель для декількох типів файлів для того, що повинна бути гістограма кожного типу, а потім використати її, щоб вгадати. Це хороший спосіб використовувати для файлів, які насправді не мають тих "магічних заголовків", які можна легко прочитати. Майте на увазі, вам потрібно буде вивчити математику та як моделювати середню функцію гістограми та збігати їх з файлами.

2
додано
Я рекомендую поставити цю відповідь на "оригінальне" теж, оскільки воно виглядає набагато краще, ніж існуючі
додано Автор Ivo Flipse, джерело

Якщо у вас є розширення включено GD2, ви можете просто використовувати його для завантаження файлу як зображення, тоді, якщо він повернеться недійсним, ви можете спіймати помилку і повернути FALSE, в іншому випадку повернути TRUE.

2
додано

Ви можете спробувати завантажити зображення в бібліотеку GD PHP і подивитися, чи працює він.

$file = file_get_contents('file');
$img = imagecreatefromstring($file);
if($img === FALSE){
 //file is NOT an image
}
else{
 //file IS an image
}
1
додано

For the first question is extension is known you could use the PHP function in_array() Documentation

1
додано
Як саме це допомагає?
додано Автор Rocket Hazmat, джерело

exif_imagetype() може працювати

переконайтеся, що ви включили exif.

1
додано

Подивіться на імідж магії визначити. http://www.imagemagick.org/script/identify.php

The PHP wrapper is here: http://www.php.net/manual/en/function.imagick-identifyimage.php

Or if you just want to validate that it's an image (and don't care about the meta data): http://www.php.net/manual/en/function.imagick-valid.php

1
додано

Спробуйте ознайомитися з exif_imagetype

0
додано

Тип зображення, як правило, може бути виведено з заголовка інформації файлу.

0
додано

You can use the Fileinfo extension: http://www.php.net/manual/en/function.finfo-file.php

finfo_file() використовує магічні байти і не потрібно завантажувати весь образ у пам'ять. Результат - це рядок з відповідним типом MIME, наприклад:

  • text/html
  • image/gif
  • application/vnd.ms-excel
0
додано

Якщо вам потрібне швидке рішення, використовуйте imagesx() та imagesy (). Існує також швидкий спосіб перевірки великих розмірів файлів зображення, читаючи лише невелику кількість даних з заголовку файлу. Детальніше пояснюється на наступній сторінці:

http://hungred.com/useful-information/php-fastest- зображення-ширина-висота/

0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php