получение расширения файла php
Получить расширение файла в PHP
В данной статье я расскажу очень простые способы, как можно получить расширение файла средствами PHP. Опишу все подробно. Для начала заносим название файла в переменную:
Далее нам поможет функция Explode с помощью которой разбиваем строку на подстроки.
В качестве разделителя используется символ точки (.), То есть символ разделения названия файла от его расширения.
Последнее что нужно, это взять последний элемент массива. В этом нам поможет функция End:
Вот и все, теперь в переменной $mime содержаться значение расширения файла.
В данном случае мы видим как результат работы функции Explode передается непосредственно как параметр в функцию End. Но функция End работает с указателем на массив, а не со значением массива.
Для решения необходимо сперва перенести значение в временную переменную, и только потом передаем в End указатель на эту переменную.
Собственно все ошибки подобного рода решаются именно таким образом. Если в вашей программе где-то стала вылетать вышеуказанная ошибка, то просто создавайте временную переменную.
Таким же способом можно получить расширения файла, но вместо функции End используется функция Array_pop:
Функция Array_pop удаляет элемент в конце массива, то есть не только возвращает последнее значение массива. На одну операцию выполняется более чем с функцией End, но разница настолько маленькая, что на это даже не стоит акцентировать внимание.
Выполнить поиск расширения можно используя вместе функцию Substr и функцию Strrpos:
Чтобы избавиться самой точки в полученном подстроке, увеличиваем начало старта на одно смещение вправо (1).
Существует также функция Pathinfo, с помощью которой можно получить расширение файла. По моему мнению, это лучший вариант. Для этого выполняем простой код:
Здесь описаны простые способы получения расширение файла, но помните, это только для ознакомления, или даже для демонстрации возможностей языка PHP. На самом деле, вам самим решать, каким образом использовать для различных случаев возможен особый подход.
Как определить расширение файла в PHP
Задача определения расширения возникает в разработке достаточно часто – здесь и загрузка файлов на сервер, и анализ имеющихся файлов, и поиск файла. В работе с файлами на сервере, есть так же частое решение сохранения файла не с исходным именем, а назначение в качестве имени файла текущего значения TIMESTAMP сервера. Решений у этой задачи существует немало для разных языков программирования. Хотя некоторые решения, в первую очередь, приходящие на ум, иногда приходится дорабатывать из-за того разнообразия имен файлов которые только могут быть. Для файла с именем «myfile.txt» можно смело предложить разбить строку на части разделенные точкой и взять последнюю. Но что делать с файлами «my.file.txt» или в случае, если расширение не указано «myfile»?
В этой статье, рассмотрим такие решения.
Для удобства имя файл зададим в строковой переменной:
Самое простое и удобное, на мой взгляд, решение использовать с, которая вернет ассоциированный массив, содержащий сведения полном имени, расширении и директории файла. После этого остается только вывести необходимый элемент массива.
Чтобы не делать собственную функцию можно упросить код, указав в качестве второго параметра значение PATHINFO_EXTENSION. В этом случае функция вернет не весь массив, а только значение расширения.
Оба варианта корректно вернут значение расширения «txt», кроме случая, где расширение не указано. Там, где расширения нет, будет возвращена пустая строка.
Это решение доступно для PHP, начиная с версии 4.0.3.
Если по причине версии PHP или какой-либо другой причине это решение не доступно, можно использовать традиционное решение – разбивку строки имени файла на части между точками, считая, что последний участок и будет расширением.
Здесь, функция explode() разбивает строку на массив из символов, разделенных точками, а функция end() возвращает последний элемент полученного массива.
В этом примере, если расширение не задано явно, т.е. точки в имени файла нет, будет возвращено исходное имя файла. В случае, если расширение есть, оно будет получено корректно.
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.
basename
(PHP 4, PHP 5, PHP 7, PHP 8)
basename — Возвращает последний компонент имени из указанного пути
Описание
При передаче строки с путём к файлу или каталогу, данная функция вернёт последний компонент имени из данного пути.
Список параметров
На платформах Windows в качестве разделителей имён директорий используются оба слеша (прямой / и обратный \ ). В других операционных системах разделителем служит прямой слеш ( / ).
Возвращаемые значения
Примеры
Пример #1 Пример использования функции basename()
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 30 notes
It’s a shame, that for a 20 years of development we don’t have mb_basename() yet!
There is only one variant that works in my case for my Russian UTF-8 letters:
If your path has a query string appended, and if the query string contains a «/» character, then the suggestions for extracting the filename offered below don’t work.
In such a case, use:
It might be useful to have a version of the function basename working with arrays too.
Here is a quick way of fetching only the filename (without extension) regardless of what suffix the file has.
// your file
$file = ‘image.jpg’ ;
There is a real problem when using this function on *nix servers, since it does not handle Windows paths (using the \ as a separator). Why would this be an issue on *nix servers? What if you need to handle file uploads from MS IE? In fact, the manual section «Handling file uploads» uses basename() in an example, but this will NOT extract the file name from a Windows path such as C:\My Documents\My Name\filename.ext. After much frustrated coding, here is how I handled it (might not be the best, but it works):
If you want the current path where youre file is and not the full path then use this 🙂
www dir: domain.com/temp/2005/january/t1.php
Exmaple for exploding 😉 the filename to an array
A simple way to return the current directory:
$cur_dir = basename(dirname($_SERVER[PHP_SELF]))
since basename always treats a path as a path to a file, e.g.
/var/www/site/foo/ indicates /var/www/site as the path to file
foo
Even though yours is shorter, you can also do:
$ext = end(explode(«.», basename($file
Additional note to Anonymous’s mb_basename() solution: get rid of trailing slashes/backslashes!
echo mb_basename ( «/etc//» ); # «etc»
?>
I got a blank output from this code
suggested earlier by a friend here.
So anybody who wants to get the current directory path can use another technique that I use as
//suppose you’re using this in pageitself.php page
once you have extracted the basename from the full path and want to separate the extension from the file name, the following function will do it efficiently:
On windows systems, filenames are case-insensitive. If you have to make sure the right case is used when you port your application to an unix system, you may use a combination of the following:
//assume the real filename is mytest.JPG:
Because of filename() gets «file.php?var=foo», i use explode in addition to basename like here:
to get the base url of my website
Basename without query string:
Как получить (извлечь) расширение файла в PHP?
Это вопрос, который вы можете прочитать везде в Интернете с различными ответами:
Однако всегда есть «лучший способ», и он должен быть в переполнении стека.
Решение
Люди из других языков сценариев всегда думают, что их лучше, потому что у них есть встроенная функция, а не PHP (я сейчас смотрю на Pythonistas :-)).
На самом деле, оно существует, но мало кто это знает. Встретить pathinfo() :
Это быстро и встроенно. pathinfo() может дать вам другую информацию, такую как канонический путь, в зависимости от константы, которую вы передаете ей.
Помните, что если вы хотите иметь возможность работать с не ASCII-символами, вам нужно сначала установить локаль. НАПРИМЕР:
Кроме того, обратите внимание, что это не принимает во внимание содержимое файла или mime-тип, вы получаете только расширение. Но это то, что вы просили.
Наконец, обратите внимание, что это работает только для пути к файлу, а не для пути к ресурсам URL, который покрывается с помощью PARSE_URL.
Другие решения
пример URL: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
Примечание: хештеги недоступны на стороне сервера, только если они добавлены вручную.
Часто вы можете написать лучший код, если вы передаете такой объект вместо строки, тогда ваш код будет более понятным. Начиная с PHP 5.4 это однострочный текст:
E-убедительный ответ является правильным способом определения расширения файла.
В качестве альтернативы, вместо того, чтобы полагаться на расширение файла, вы можете использовать fileinfo (http://us2.php.net/fileinfo ) определить файлы MIME типа.
Вот упрощенный пример обработки изображения, загруженного пользователем:
1) Если вы используете (PHP 5> = 5.3.6)
ты можешь использовать SplFileInfo :: getExtension — получает расширение файла
Это будет выводить
2) Другой способ получить расширение, если вы используете (PHP 4> = 4.0.3, PHP 5) является PathInfo
Это будет выводить
// РЕДАКТИРОВАТЬ: убрал скобку
Пока он не содержит путь, вы также можете использовать:
Также обратите внимание, что pathinfo не в состоянии обрабатывать некоторые не-ASCII символы (обычно это просто подавляет их из вывода), в расширениях, которые обычно не являются проблемой, но не мешает знать об этом предупреждении.