2015-12-18 5 views
0

У меня есть сценарий, который помогает мне добавить некоторые данные в файл csv, основываясь на факте, если изображение находится внутри папки или нет (завершено или нет). Файлы - это изображения, поэтому мне нужно проверить, существует ли файл, и если это png, jpg, jpeg, gif.Проверьте, существует ли файл (возможно многократное расширение)?

До сих пор он только проверял, является ли это JPG, но я хотел бы, чтобы он нашел файл, если это PNG или JPEG или даже GIF.

<?php 
$columns = array("row1","row2","row3","row4","row5","row6","row7","row8","row9", 
"row10","row11","row12","row13","row14","row15","row16","row17","row18" 
); 
$rootDir = "/path/to/images/folder/files"; 
$file = fopen("database.csv", "r") or die('fopen database failed'); 
$newFile = fopen("newdata.csv", "w") or die('fopen newdata.csv failed'); 
while (($data = fgetcsv($file, 999999, ";")) !== FALSE) { 
    $row = array_combine($columns, $data); 
    $filename = $row['row4'].".jpg"; // could be png or jpEg, or even gif 
    if (file_exists("$rootDir/$filename")) { 
     $row['image'] = .$filename; //also needs correct extension of image which exists. 
     $row['small_image'] = .$filename; 
     $row['thumbnail'] = .$filename; 
    } 
    fputcsv($newFile, array_values($row), ";",'"'); 
} 
fclose($file); 
fclose($newFile); 
?> 
+0

Вы можете создать массив с расширениями и положить '$ имя_файла = $ . "JPG" строки [ 'row4']; // может быть png или jpEg или даже gif if (file_exists ("$ rootDir/$ filename")) { $ row ['image'] =. $ filename; // также требует правильного расширения существующего изображения. $ row ['small_image'] =. $ Filename; $ row ['thumbnail'] =. $ Filename; } 'in a для проверки расширений –

+1

предложение: проверьте [exif_imagetype] (http://php.net/manual/en/function.exif-imagetype.php), он может дать вам более четкие детали типа изображения, чем проверка extension – bansi

+0

Итак, 'row4' содержит корень имени файла без расширения? –

ответ

0

Вы можете сделать что-то вроде этого:

// your code 

$possible_extensions = array("jpg", "jpeg", "png", "gif"); 
$row = array_combine($columns, $data); 
foreach($possible_extensions as $ext){ 
    $filename = $row['row4'] . "." . $ext; 
    if (file_exists("$rootDir/$filename")) { 
     $row['image'] = .$filename; 
     $row['small_image'] = .$filename; 
     $row['thumbnail'] = .$filename; 
     break; 
    } 
} 
fputcsv($newFile, array_values($row), ";",'"'); 

// your code 

Отредактировано:

Если вы хотите выполнить регистронезависимое file_exists() проверить, тогда вот решение,

Следующая функция fileExists() возвращает полный файл пути, если найден, и false, если нет.

function fileExists($fileName, $caseSensitive = true) { 

    if(file_exists($fileName)) { 
     return $fileName; 
    } 
    if($caseSensitive) return false; 

    // Handle case insensitive requests    
    $directoryName = dirname($fileName); 
    $fileArray = glob($directoryName . '/*', GLOB_NOSORT); 
    $fileNameLowerCase = strtolower($fileName); 
    foreach($fileArray as $file) { 
     if(strtolower($file) == $fileNameLowerCase) { 
      return $file; 
     } 
    } 
    return false; 
} 

Вот источник:

А теперь ваш код,

// your code 

$possible_extensions = array("jpg", "jpeg", "png", "gif"); 
$row = array_combine($columns, $data); 
foreach($possible_extensions as $ext){ 
    $filename = $row['row4'] . "." . $ext; 
    if ($filename = fileExists("$rootDir/$filename", false)) { 
     $row['image'] = .$filename; //also needs correct extension of image which exists. 
     $row['small_image'] = .$filename; 
     $row['thumbnail'] = .$filename; 
     break; 
    } 
} 
fputcsv($newFile, array_values($row), ";",'"'); 

// your code 
+0

Mmmm ... как насчет файлов с расширением '.JPG', а не' .jpg' и других вариантов корпуса. –

+0

Это немного дорого, потому что вы перебираете каждое имя файла четыре раза. Было бы лучше посмотреть на каждое имя файла, а затем запустить цикл, проверяя расширение, пока не найдет правильный. В этот момент вы будете запускать только каждые четыре раза, если бы они были всем расширением, которое было последним в вашем массиве. –

+0

@MarkSetchell hmm, в этом случае это было бы дорого из-за размера массива. –

Смежные вопросы