Как получить расширение файла по пути с любым расширением? решаемая - PullRequest
0 голосов
/ 28 апреля 2020

Решено! "../pictures/uploads/profile" Я изменил на "./pictures/uploads/profile". Моя ошибка, прости! И я использовал ответ от @Kunal Raut

Я хочу получить расширение файла в PHP из пути. У меня есть этот код:

$fileName = "../pictures/uploads/profile".$id.".*";
$ext = pathinfo($fileName, PATHINFO_EXTENSION);

$sourceImg = "../pictures/uploads/profile".$id.".".$ext."?".mt_rand();

У меня есть папка с картинками. Они могут быть в PNG или JPG или JPEG. И php файл находится в другой папке. Так как это сделать?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Просто используйте класс DirectoryIterator.

foreach (new DirectoryIterator('../pictures/uploads') as $fileInfo) {
    if ($fileInfo->isDot()) continue;

    if (stripos($fileInfo->getFilename(), 'profile' . $id) !== false) {
        var_dump($fileInfo->getExtension());
    }
}

Класс DirectoryIterator доступен с PHP 5.3.6.

Более подробным примером может быть Экземпляр DirectoryIterator, используемый экземпляром FilterIterator, чтобы просто вывести нужные файлы. В данном примере требуется минимум PHP 7.4. Если вы используете версию PHP меньше 7.4, удалите подсказки типов для свойств класса.

class MyFileFilter extends FilterIterator
{
    protected string $filename;
    public function __construct(Iterator $iterator, $filename)
    {
        $this->filename = $filename;
        parent::__construct($iterator);
    }

    public function accept(): bool
    {
        $info = $this->getInnerIterator();
        return stripos($info->getFilename(), $this->filename) !== false;
    }
}

Класс FilterIterator доступен начиная с PHP 5.1. Показанное выше расширение использует Iterator, ищет указанное имя файла и возвращает объект SplFileInfo, если имя файла совпадает.

Как его использовать:

$directory = new DirectoryIterator('../pictures/uploads');
$filename = 'picture' . $id;
$filter = new MyFileFilter($directory, $filename);

foreach ($filter as $file) {
    var_dump($file->getExtension());
}

Foreach l oop в основном фильтр, который возвращает только файлы, которые соответствуют заданному имени файла. Каждый возвращаемый файл является экземпляром SplFileInfo. При этом вы можете использовать метод SplFileInfo :: getExtension (), чтобы получить расширение файла.

Последним, но не менее важным является класс GlobIterator , который доступен с PHP 5.3. Это самый простой способ итерации по заданному пути с заполнителями.

$filesystem = new GlobIterator('../pictures/uploads/profile' . $id . '.*');
foreach ($filesystem as $file) {
    var_dump($file->getExtension());
}
0 голосов
/ 28 апреля 2020

Вы можете получить все расширения в каталоге, используя функцию scandir() как

$fileName = scandir("../pictures/uploads/");
$ext = "";
foreach($fileName as $files) {
if($files !== '.' && $files !== '..') {
$ext = pathinfo($files, PATHINFO_EXTENSION);
 }
}
 echo $ext .'<br>';

Обычно scandir () возвращает первые два значения в массиве как . и .., и если условие указано в ответе, вы можете удалить эти нежелательные значения и получить ответ в чистом виде.

Примечание: scandir() возвращает значения в форма массива.

у меня получилось, смотри ниже

enter image description here

0 голосов
/ 28 апреля 2020

$ fileName = "../pictures/uploads/profile".$id.".*"; // <---- это не файл, поместите имя файла $ ext = pathinfo ($ fileName, PATHINFO_EXTENSION); </p>

Попробуйте это:

$files = scandir("../pictures/uploads/");
foreach ($files as $fileName) {
   $ext = pathinfo($fileName, PATHINFO_EXTENSION); 
}
...