php узнать расширение файла
Получить расширение файла в PHP
В данной статье я расскажу очень простые способы, как можно получить расширение файла средствами PHP. Опишу все подробно. Для начала заносим название файла в переменную:
Далее нам поможет функция Explode с помощью которой разбиваем строку на подстроки.
В качестве разделителя используется символ точки (.), То есть символ разделения названия файла от его расширения.
Последнее что нужно, это взять последний элемент массива. В этом нам поможет функция End:
Вот и все, теперь в переменной $mime содержаться значение расширения файла.
В данном случае мы видим как результат работы функции Explode передается непосредственно как параметр в функцию End. Но функция End работает с указателем на массив, а не со значением массива.
Для решения необходимо сперва перенести значение в временную переменную, и только потом передаем в End указатель на эту переменную.
Собственно все ошибки подобного рода решаются именно таким образом. Если в вашей программе где-то стала вылетать вышеуказанная ошибка, то просто создавайте временную переменную.
Таким же способом можно получить расширения файла, но вместо функции End используется функция Array_pop:
Функция Array_pop удаляет элемент в конце массива, то есть не только возвращает последнее значение массива. На одну операцию выполняется более чем с функцией End, но разница настолько маленькая, что на это даже не стоит акцентировать внимание.
Выполнить поиск расширения можно используя вместе функцию Substr и функцию Strrpos:
Чтобы избавиться самой точки в полученном подстроке, увеличиваем начало старта на одно смещение вправо (1).
Существует также функция Pathinfo, с помощью которой можно получить расширение файла. По моему мнению, это лучший вариант. Для этого выполняем простой код:
Здесь описаны простые способы получения расширение файла, но помните, это только для ознакомления, или даже для демонстрации возможностей языка PHP. На самом деле, вам самим решать, каким образом использовать для различных случаев возможен особый подход.
filetype
(PHP 4, PHP 5, PHP 7, PHP 8)
filetype — Возвращает тип файла
Описание
Возвращает тип указанного файла.
Список параметров
Возвращаемые значения
Возвращает тип файла. Возможными значениями являются fifo, char, dir, block, link, file, socket и unknown.
Ошибки
Примеры
Пример #1 Пример использования функции filetype()
echo filetype ( ‘/etc/passwd’ ); // file
echo filetype ( ‘/etc/’ ); // dir
Примечания
Смотрите также
User Contributed Notes 6 notes
There are 7 values that can be returned. Here is a list of them and what each one means
block: block special device
char: character special device
fifo: FIFO (named pipe)
link: symbolic link
unknown: unknown file type
filetype() does not work for files >=2GB on x86 Linux. You can use stat as a workarround:
Note that stat returns diffenerent strings («regular file»,»directory». )
I use the CLI version of PHP on Windows Vista. Here’s how to determine if a file is marked «hidden» by NTFS:
This should work on any Windows OS that provides DOS shell commands.
Putting @ in front of the filetype() function does not prevent it from raising a warning (Lstat failed), if E_WARNING is enabled on your error_reporting.
The most common cause of filetype() raising this warning and not showing a filetype() in the output (it actually returns NULL) is, if you happened to pass just the ‘Dir or File Name’ and not the complete «Absolute or Relative Path» to that ‘file or Dir’. It may still read that file and return its filetype as «file» but for Dir’s it shows warning and outputs NULL.
eg:
$pathToFile = ‘/var/www’;
$file = ‘test.php’;
$dir = ‘somedir’;
Output for filetype($file) will be returned as ‘file’ and possibly without any warning, but for filetype($dir), it will return NULL with the warning «Lstat failed», unless you pass a complete path to that dir, i.e. filetype($pathToFile.’/’.$dir).
This happened to me and found this solution after a lot of trial and error. Thought, it might help someone.
Note there is a bug when using filetype with for example Japanese filenames :
https://bugs.php.net/bug.php?id=64699
The whole PHP interpreter comes crashing down without anyway to avoid it or capture an exception.
Как проверить загруженный тип файла в PHP
я использовал этот код для проверки типа изображений,
но некоторые пользователи жалуются, что они получают ошибку при загрузке любого типа изображений, в то время как некоторые другие не получают никаких ошибок!
мне было интересно, устраняет ли это проблему:
if (mime_content_type($_FILES[‘fupload’][‘type’]) == «image/gif»)<.
8 ответов
кроме того, finfo функции отлично, если ваш сервер поддерживает их.
В дополнение к @deceze, вы можете также finfo() чтобы проверить MIME-тип файлов без изображений:
конечно, вы можете проверить, является ли это изображение с exif, но лучший способ, я думаю, это сделать с finfo так:
лучший способ, на мой взгляд, сначала использовать getimagesize() следовал по imagecreatefromstring().
проверка getimagesize() предотвращает некоторые DoS-атаки, потому что нам не нужно пытаться imagecreatefromstring() из каждого файла, предоставленного пользователем, либо файл без изображения или файл слишком большой. К сожалению, согласно PHP docs нельзя полагаться на проверку содержимого типа изображения.
на imagecreatefromstring() наконец пытается открыть файл как образ-если это удается-у нас есть образ.
в PHP 5.5 я использую эту функцию для получения типа файла и проверки изображения:
затем вы могли бы сделать:
Это просто один сценарий, который я часто использую.
в основном я использую mime_content_type (), чтобы получить что-то вроде «image/jpg», а затем взрываю его на «/» и проверяю первый элемент массива, чтобы увидеть, говорит ли он «image».
надеюсь, это сработает!
эта последняя строка близка. Вы можете использовать: if (mime_content_type($_FILES[‘fupload’][‘tmp_name’]) == «image/gif»)<.
предупреждение: следующий ответ фактически не проверяет тип файла. Он только проверяет имя. Это не подходит для фактических целей безопасности.
EDIT: не используйте этот метод поскольку он не служит для проверки безопасности. Я оставляю этот ответ здесь, чтобы никто не сделал такую же ошибку, как я, попробовав это.
я попробовал следующее, И это сработало для меня:
Как получить (извлечь) расширение файла в PHP?
Это вопрос, который вы можете прочитать повсюду в Интернете с различными ответами:
Тем не менее, всегда есть «лучший способ», и он должен быть включен в stackoverflow.
Люди из других языков сценариев всегда думают, что их лучше, потому что у них есть встроенная функция, чтобы сделать это, а не PHP (я смотрю на pythonistas прямо сейчас :-)).
На самом деле, она существует, но мало кто ее знает. Знакомство с pathinfo() :
Это быстро и удобно. pathinfo() может предоставить вам другую информацию, такую как канонический путь, в зависимости от константы, которую вы передаете ей.
Помните, что если вы хотите иметь дело с символами, отличными от ASCII, вам нужно сначала установить локаль. НАПРИМЕР:
Также обратите внимание, что это не учитывает содержимое файла или mimetype, вы получаете только расширение. Но это то, о чем вы просили.
Наконец, обратите внимание, что это работает только для пути к файлу, а не для пути URL-адресов, который рассматривается с помощью PARSE_URL.
например, URL-адрес http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
PATHINFO дает:
PARSE_URL дает:
ps note, Hashtag часть url (т.е. #smth ) недоступна в PHP-запросе, но только с javascript.
Существует также SplFileInfo :
Часто вы можете написать лучший код, если вы передаете такой объект, а не строку, тогда ваш код будет более разговорным. Поскольку PHP 5.4 это однострочный:
Ответ E-satis – это правильный способ определения расширения файла.
В качестве альтернативы вместо того, чтобы полагаться на расширение файлов, вы можете использовать fileinfo ( http://us2.php.net/fileinfo ), чтобы определить тип файлов MIME.
Вот упрощенный пример обработки изображения, загруженного пользователем:
1) Если вы используете (PHP 5> = 5.3.6), вы можете использовать SplFileInfo :: getExtension – Получает расширение файла
Это приведет к выводу
2) Другой способ получения расширения, если вы используете (PHP 4> = 4.0.3, PHP 5), – это pathinfo
Это приведет к выводу
// EDIT: удалена скобка
Также обратите внимание, что pathinfo не может обрабатывать некоторые символы, отличные от ASCII (обычно это просто подавляет их из вывода), в расширениях, которые обычно не являются проблемой, но не мешает осознавать эту оговорку.
Пока он не содержит пути, вы также можете использовать:
Быстрое исправление будет чем-то вроде этого.
pathinfo – массив. Мы можем проверить имя каталога, имя файла, расширение и т. Д.
Это будет работать
Я нашел, что это был надежный способ использования pathinfo() в URL-адресе после первого разбора его, чтобы pathinfo() ненужный беспорядок после расширения файла:
вы также можете попробовать следующее:
Давайте проверим сравнительный результат здесь: https://eval.in/661574
Вы можете получить все расширения файлов в определенной папке и выполнить операцию с определенным расширением файла
Если вы ищете скорость (например, в маршрутизаторе), вы, вероятно, не хотите все делать токенизировать. Многие другие ответы не будут выполнены с /root/my.folder/my.css
вы также можете попробовать это
(работа над php 5. * и 7)
tip: он возвращает пустую строку, если файл не имеет расширения
наслаждайся этим 😉
для быстрого поиска извлечения (если вы точно знаете, что у вашего имени файла есть один).
pathinfo
(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)
pathinfo — Возвращает информацию о пути к файлу
Описание
Подробнее о получении информации о текущем пути, можно почитать в разделе Предопределённые зарезервированные переменные.
Список параметров
Если flags не указан, то возвращаются все доступные элементы.
Возвращаемые значения
Если path содержит больше одного расширения, то PATHINFO_EXTENSION возвращает только последний и PATHINFO_FILENAME удаляет только последнее расширение. (смотрите пример ниже).
Если path не содержит расширения, то не будет возвращён элемент extension (смотрите ниже второй пример).
Если basename параметра path начинается с точки, то все последующие символы интерпретируются как расширение файла ( extension ) и имя файла filename будет пустым (смотрите третий пример).
Примеры
Пример #1 Пример использования функции pathinfo()
Результат выполнения данного примера:
Результатом выполнения данного примера будет что-то подобное:
Пример #3 Пример pathinfo() для файла, начинающегося с точки
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
User Contributed Notes 37 notes
// result:
// string(11) «lib.inc.php»
// string(15) «/www/htdocs/inc»
?>
pathinfo() is locale aware, so for it to parse a path containing multibyte characters correctly, the matching locale must be set using the setlocale() function.
Reality:
var_dump(pathinfo(‘中国人2016.xls’));
exit();
array(4) < 'dirname' =>string(1) «.» ‘basename’ => string(8) «2016.xls» ‘extension’ => string(3) «xls» ‘filename’ => string(4) «2016» >
Expect(Solve):
setlocale(LC_ALL, ‘zh_CN.UTF-8’);
var_dump(pathinfo(‘中国人2016.xls’));
exit();
array(4) < 'dirname' =>string(1) «.» ‘basename’ => string(17) «中国人2016.xls» ‘extension’ => string(3) «xls» ‘filename’ => string(13) «中国人2016» >
Use this function in place of pathinfo to make it work with UTF-8 encoded file names too
Here is a simple function that gets the extension of a file. Simply using PATHINFO_EXTENSION will yield incorrect results if the path contains a query string with dots in the parameter names (for eg. &x.1=2&y.1=5), so this function eliminates the query string first and subsequently runs PATHINFO_EXTENSION on the clean path/url.
Checked with version 5.5.12:
It works fine with filenames with utf-8 characters, pathinfo will strip them away:
( pathinfo ( «/mnt/files/飛兒樂團光茫.mp3» ));
?>
.. will display:
Array
(
[dirname] => /mnt/files
[basename] => 飛兒樂團光茫.mp3
[extension] => mp3
[filename] => 飛兒樂團光茫
)
Note that this function seems to just perform string operations, and will work even on a non-existent path, e.g.
( pathinfo ( ‘/no/where/file.txt’ ));
?>
which will output:
Array
(
[dirname] => /no/where
[basename] => file.txt
[extension] => txt
[filename] => file
)
if you call pathinfo with a filename in url-style (example.php?with=parameter), make sure you remove the given parameters before, otherwise they will be returned as part of the extension.
unexpected, but longtime (all versions?) consistent, behaviour with trailing slash (Linux):
with Linux I am used, to add a trailing slash,
or just to keep that of the command line completion by [TAB],
to avoid mistyping a path on cp or mv with a same filename instead of a directory
// using php tags here only for syntax highlighting
php > var_dump ( pathinfo ( ‘/home/USER/www.2021-05/’ ));
array( 4 ) <
[ «dirname» ]=> string ( 10 ) «/home/USER»
[ «basename» ]=> string ( 11 ) «www.2021-05»
[ «extension» ]=> string ( 7 ) «2021-05»
[ «filename» ]=> string ( 3 ) «www»
>
When you need to get the file extension to upload a file with a POST method, try this way:
//[‘tmp_name] gets the temporal name of the file (not the real name), which will be used later
//Here is the magic of pathinfo to get the file extension