Как получить (извлечь) расширение файла в PHP?
Люди из других языков сценариев всегда думают, что их лучше, потому что у них есть встроенная функция, а не PHP (я сейчас смотрю на Pythonistas :-)).
На самом деле, оно существует, но мало кто это знает. Познакомьтесь с pathinfo() :
$ext = pathinfo($filename, PATHINFO_EXTENSION);
Это быстро и встроенно. pathinfo() может дать вам другую информацию, такую как канонический путь, в зависимости от константы, которую вы передаете ей.
Помните, что если вы хотите иметь возможность работать с не ASCII-символами, вам нужно сначала установить локаль. НАПРИМЕР:
Также обратите внимание, что это не учитывает содержимое файла или mime-тип, вы получаете только расширение. Но это то, что вы просили.
Наконец, обратите внимание, что это работает только для пути к файлу, а не для пути к ресурсам URL, который покрывается с помощью PARSE_URL.
Я хотел бы проголосовать за это дважды. Я не могу сказать вам, сколько кода я смог заменить, используя pathinfo
@khizaransari Вы должны искать другого хостинг-провайдера, тот, который вы получили, глупый. На самом деле, я имею в виду это. Нет никаких причин отключать эту функцию. Скажи им это. В качестве обходного пути: function get_ext($fname) < return substr($fname, strrpos($fname, ".") + 1); >Убедитесь, что файл имеет расширение, но он может делать что угодно, когда вы передаете путь в качестве аргумента!
мое представление о PHP по сравнению с python полностью изменилось теперь, когда я знаю об этой функции: O
@ e-удовлетворительно, но в моем приложении он не работает ни по одному сценарию. Например, иногда я получаю URL в следующем формате: www.domain.com/image.php?id=123&idlocation=987&number=01 для загрузки изображений с этого У uRL нет имени или расширения изображения, которое pathifo () не может предоставить нам расширение изображения. ТАК, что должно быть сделано, пожалуйста! Помоги мне
Это действительно несправедливо, что я не тратил впустую столько, сколько некоторые другие люди здесь, и вместо этого нашел этот ответ и быстро решил мою проблему.
Это НЕ безопасное решение. Если кто-то загрузит вашу конечную точку без использования браузера, он может подделать расширение. Например: pathinfo (‘image.jpg.spoofed’, PATHINFO_EXTENSION) возвращает «подделанный» !! Он не проверяет фактическое тело файла, поскольку не принимает путь к файлу, и не проверяет его результат с помощью карты MimeType. Вы должны убедиться, что значение, которое вы получаете от этого, на самом деле является допустимым типом, запросив iana.org/assignments/media-types/media-types.txt или проверив вашу собственную карту MimeType.
$path_info = pathinfo('/foo/bar/baz.bill'); echo $path_info['extension']; // "bill"
Это даже работает на этом уровне (Twitter json): $ ext = pathinfo ($ result-> extended_entities-> media [0] -> video_info-> Варианты [1] -> URL, PATHINFO_EXTENSION);
URL-адрес примера: http://example.com/myfolder/sympony.mp3?a=1&b=2#XYZ
Забудьте уязвимого PATHINFO !
$x = pathinfo($url); $x['dirname'] ? 'http://example.com/myfolder' $x['basename'] ? 'sympony.mp3?a=1&b=2#XYZ' //
Используйте более безопасный PARSE_URL:
$x = parse_url($url); $x['scheme'] ? 'http' $x['host'] ? 'example.com' $x['path'] ? '/myfolder/sympony.mp3' $x['query'] ? 'aa=1&bb=2' $x['fragment']? 'XYZ'
Примечание: хештеги недоступны на стороне сервера, только если они добавлены вручную.
Для всех собственных примеров PHP см.: Получить полный URL в PHP
Этот ответ охватывает все, например. такой файл, как foo_folder/foo-file.jpg?1345838509 потерпит неудачу с помощью только pathinfo , спасибо
$file = new SplFileInfo($path); $ext = $file->getExtension();
Часто вы можете написать лучший код, если вы передаете такой объект вместо строки, тогда ваш код будет более разговорным. Поскольку PHP 5.4 это однострочный:
$ext = (new SplFileInfo($path))->getExtension();
@matthias: учтите, что SPL можно отключить в версиях PHP, предшествующих версии PHP 5.3.0. Если вы все еще не используете PHP 5.3, но 5.2 или ниже, этот ответ, скорее всего, не подходит для стабильного кода. В противном случае вы можете стабилизировать свой код, требуя конкретной версии PHP, и в противном случае выручите.
@hakre Хотя вы правы, говоря, что «его можно отключить в версиях, предшествующих 5.3.0», расширение SPL, тем не менее, компилируется по умолчанию в PHP 5.0.0. Так что этот комментарий действительно имеет смысл для людей, которые вынуждены использовать PHP 5.2 или ниже и не хотят уходить в отставку, используя определенные классы SPL.
$ext = pathinfo($file, PATHINFO_EXTENSION) или $ext = pathinfo($file)['extension'] являются лучшими однострочниками.
Ответ E-satis - это правильный способ определения расширения файла.
В качестве альтернативы вместо использования расширения файлов вы можете использовать fileinfo (http://us2.php.net/fileinfo), чтобы определить тип файлов MIME.
Здесь приведен упрощенный пример обработки изображения, загруженного пользователем:
// Code assumes necessary extensions are installed and a successful file upload has already occurred // Create a FileInfo object $finfo = new FileInfo(null, '/path/to/magic/file'); // Determine the MIME type of the uploaded file switch ($finfo->file($_FILES['image']['tmp_name'], FILEINFO_MIME)) < case 'image/jpg': $im = imagecreatefromjpeg($_FILES['image']['tmp_name']); break; case 'image/png': $im = imagecreatefrompng($_FILES['image']['tmp_name']); break; case 'image/gif': $im = imagecreatefromgif($_FILES['image']['tmp_name']); break; >
Это единственный правильный ответ. Я не понимаю, почему люди проголосовали за других. Да, этот подход требует больше усилий от разработчика, но он повышает производительность (хотя и мало, но это так). Пожалуйста, обратитесь это .
@Bhavik: В некоторых случаях нам может понадобиться только расширение файла, они о проверке MIME-типа. Но фактический вопрос касается расширения файла, а не типа файла. Так что это НЕ лучший ответ на этот вопрос. (пока ответ)
1) Если вы используете (PHP 5 >= 5.3.6) вы можете использовать SplFileInfo:: getExtension - Получает расширение файла
getExtension()); $info = new SplFileInfo('test.tar.gz'); var_dump($info->getExtension()); ?>
2) Другой способ получения расширения, если вы используете (PHP 4 >= 4.0.3, PHP 5), PathInfo
Пока он не содержит путь, вы также можете использовать:
Где $fname - это имя файла, например: my_picture.jpg И результатом будет: jpg
Это лучший способ, когда вам нужно реальное расширение и имя файла может иметь несколько символов. Например, загруженные пользователем фотографии в моем случае.
Это не удастся, если имя файла не имеет расширения. Попробуйте передать «myfile», и он вернет «myfile». Правильное возвращаемое значение - пустая строка как расширение в этом случае использования.
Это неправильно в том, что array_pop () выдаст уведомление, потому что в качестве параметра он принимает указатель.
Иногда полезно не использовать pathinfo($path, PATHINFO_EXTENSION) , например:
$path = '/path/to/file.tar.gz'; echo ltrim(strstr($path, '.'), '.'); // tar.gz echo pathinfo($path, PATHINFO_EXTENSION); // gz
Также обратите внимание, что pathinfo не может обрабатывать некоторые символы, отличные от ASCII (обычно это просто подавляет их из вывода), в расширениях, которые обычно не являются проблемой, но не мешает осознавать эту оговорку.
@ e-sat: Согласно Википедии, они являются двумя расширениями: UNIX-подобные файловые системы используют другую модель без разделенных метаданных расширения. Точечный символ - это просто еще один символ в главном имени файла, и имена файлов могут иметь несколько расширений, обычно представляющих вложенные преобразования, такие как files.tar.gz .
Это не удастся, так как /root/my.folder/my.css ltrim(strrchr($PATH, '.'),'.') Работает как pathinfo, но без использования токенов.
Самый простой способ получить расширение файла в php - использовать встроенную функцию php pathinfo.
$file_ext = pathinfo('your_file_name_here', PATHINFO_EXTENSION); echo ($file_ext); // the out should be extension of file eg:-png, gif, html
Быстрое исправление будет примерно таким.
//exploding the file based on . operator $file_ext = explode('.',$filename); //count taken (if more than one . exist; files like abc.fff.2013.pdf $file_ext_count=count($file_ext); //minus 1 to make the offset correct $cnt=$file_ext_count-1; // the variable will have a value pdf as per the sample file name mentioned above. $file_extension= $file_ext[$cnt];
Почему бы просто не использовать встроенную функцию php для php.net/manual/en/function.pathinfo.php вместо длинного кода
Помимо точки зрения Шахбаза, вы также можете просто сделать $file_ext = end(explode('.', $filename)); сделать все в этом ответе в одной строке вместо четырех.
@ Амелия Что если у тебя есть .tar.gz . Это не будет работать, поэтому, если вам нужно использовать расширение, например ltrim(strstr($filename, '.'), '.'); вместо того, чтобы некорректно получить полное расширение как gz .
substr($path, strrpos($path, '.') + 1);
Это должно работать правильно: substr ($ path, strrpos ($ path, '.') + 1); Примечание: этот метод быстрее, чем любые другие решения выше. Попробуйте эталонный тест, используя наш собственный скрипт.
вы также можете попробовать это (работа над php 5. * и 7)
$info = new SplFileInfo('test.zip'); echo $info->getExtension(); // ----- Output -----> zip
tip: он возвращает пустую строку, если файл не имеет расширения
наслаждайтесь этим;)
pathinfo - массив. Мы можем проверить имя каталога, имя файла, расширение и т.д.
$path_parts = pathinfo('test.png'); echo $path_parts['extension'], "\n"; echo $path_parts['dirname'], "\n"; echo $path_parts['basename'], "\n"; echo $path_parts['filename'], "\n";
Вот пример, предположим, что $filename является "example.txt"
$ext = substr($filename,strrpos($filename,'.',-1),strlen($filename));
Таким образом, $ext будет ".txt"
Я обнаружил, что решения pathinfo() и SplFileInfo хорошо подходят для стандартных файлов в локальной файловой системе, но вы можете столкнуться с трудностями, если работаете с удаленными файлами, поскольку URL-адреса для допустимых изображений могут иметь # (идентификаторы фрагментов) и/или ? (параметры запроса) в конце URL-адреса, которые оба эти решения будут (некорректно) рассматривать как часть расширения файла.
Я нашел, что это был надежный способ использовать pathinfo() в URL после первого разбора его, чтобы вырезать ненужный беспорядок после расширения файла:
$url_components = parse_url($url); // First parse the URL $url_path = $url_components['path']; // Then get the path component $ext = pathinfo($url_path, PATHINFO_EXTENSION); // Then use pathinfo()
https://
Предоставляет доступ только для чтения файлов/ресурсов через HTTP 1.0, используя метод HTTP GET. Для поддержки name-based виртуальных хостов вместе с запросом посылается заголовок Host:. Если вы сконфигурировали строку user_agent, используя ваш файл php.ini или контекст потока, то она также будет включена в запрос.
Этот поток также позволяет получить доступ к содержимому ресурса; заголовки сохраняются в переменной $http_response_header .
Если важно знать URL, с которого был получен документ (после всех переадресаций, которые были произведены), то вам необходимо обработать серию заголовков ответов, возвращаемых потоком.
INI-директива from будет использоваться для заголовка From:, если установлена и не переопределена в контексте Контекстные опции и параметры.
Использование
- http://example.com
- http://example.com/file.php?var1=val1&var2=val2
- http://user:password@example.com
- https://example.com
- https://example.com/file.php?var1=val1&var2=val2
- https://user:password@example.com
Опции
Атрибут | Поддержка |
---|---|
Ограничение по allow_url_fopen | Да |
Чтение | Да |
Запись | Нет |
Добавление | Нет |
Одновременное чтение и запись | Недоступно |
Поддержка stat() | Нет |
Поддержка unlink() | Нет |
Поддержка rename() | Нет |
Поддержка mkdir() | Нет |
Поддержка rmdir() | Нет |
Список изменений
Версия | Описание |
---|---|
4.3.7 | Определение сбойных IIS-серверов для избежания ошибок типа "SSL: Fatal Protocol Error". |
4.3.0 | Добавлен протокол https://. |
4.0.5 | Добавлена поддержка переадресаций. |
Примеры
Пример #1 Определение URL, с которого был забран документ после переадресаций
$meta_data = stream_get_meta_data ( $fp );
foreach ( $meta_data [ 'wrapper_data' ] as $response )
/* Были ли мы переадресованы? */
if ( strtolower ( substr ( $response , 0 , 10 )) == 'location: ' )
/* Сохранить в $url адрес, куда нас переадресовали */
$url = substr ( $response , 10 );
>
Примечания
Замечание: Протокол HTTPS поддерживается только когда расширение openssl включено.
Соединения HTTP предназначены только для чтения; запись данных или копирование файлов в HTTP-ресурс не поддерживается.
Отправка запросов POST и PUT, например, может быть выполнена с помощью HTTP-контекста.