Попытка выполнить условие, основанное на типе файла, используя strpos - PullRequest
0 голосов
/ 24 октября 2019

Я нахожусь в процессе создания условия. Условие состоит в том, чтобы сразу проверить, не является ли какой-либо из файлов основными файлами изображений (png, jpg и т. Д. - файлы, показанные в условии) (в if). Если это так, то файл file_put_contents должен работать. Если загружаются только базовые файлы изображений, остальное должно работать.

На данный момент остальное никогда не запускается. Например, если я загружаю один файл с расширением .png, должен выполняться оператор else.

Когда кто-то добавляет файл, я проверяю тип файла с помощью $uploadedFileTypes = $fu->getImageFileTypes(); и затем внедряю его в список. Это 100% работает.

Вот пример того, что я хочу, чтобы произошло:

Если кто-то загрузит два файла - .png и .stp, тогда должен запускаться if. Я хочу, чтобы остальные запускались только в том случае, если загружаемые файлы являются основными файлами изображений. Есть ли лучший способ сделать это?

Затем я использую функцию strpos для проверки каждого типа файла изображения, который я указал.

if (strpos($fileTypeString,$pdf) || strpos($fileTypeString,$jpg) || strpos($fileTypeString,$jpeg) || strpos($fileTypeString,$png) || strpos($fileTypeString,$gif) === false) {

Кто-нибудь видит, что я делаю неправильно?

$date = new DateTime();
$fu = new fileUpload();
$filename = $fu->upload();
$uploadedFileTypes = $fu->getImageFileTypes();
$fileTypeString = implode( ", ", $uploadedFileTypes );
$pdf = "pdf";
$jpg = "jpg";
$jpeg = "jpeg";
$png = "png";
$gif = "gif";
file_put_contents('file_type_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r($uploadedFileTypes, true), FILE_APPEND);

foreach ($_FILES as $file) {
    foreach($file['name'] as $key => $value) {
        if (!empty($value)) { //empty string
            if ($file['error'][$key] != 4) {
                if (strpos($fileTypeString,$pdf) || strpos($fileTypeString,$jpg) || strpos($fileTypeString,$jpeg) || strpos($fileTypeString,$png) || strpos($fileTypeString,$gif) === false) {
                    file_put_contents('file_norm_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r('There were other types of files uploaded', true), FILE_APPEND);
                } else {
                    $out = (count($filename) > 1 ? 'Multiple files were' : 'A file was'). '  uploaded. You can download ' . (count($filename) > 1 ? 'them' : 'the file'). ' from:</ul>';
                    foreach ($filename as $indFile) {
                        //print_r($template);
                        $out .= "<li><a href='/php/uploads/{$indFile}'>{$indFile}</a></li>";
                    }
                    $out .= '</ul>';
                    $template = str_replace("{filename}", $out, $template);
                }
            } else { //error code IS #4
                //echo "error code is 4";
            }
        } else {
            //echo "name is empty!";
            $template = str_replace("{filename}", '', $template);
        }
    }
}

Редактировать, Новый код с другим подходом:

$date = new DateTime();
$fu = new fileUpload();
$filename = $fu->upload();
$uploadedFileTypes = $fu->getImageFileTypes();
$fileTypeString = implode( ", ", $uploadedFileTypes);
$imageTypes = ["pdf","jpg", "jpeg", "png", "gif"];
$nonImgFiles = false;
$imgFiles = false;

if (!in_array($uploadedFileTypes, $imageTypes)) {
    $nonImgFiles = true;
}

if (in_array($uploadedFileTypes, $imageTypes)) {
    $imgFiles = true;
}

foreach ($_FILES as $file) {
    foreach($file['name'] as $key => $value) {
        if (!empty($value)) { //empty string
            if ($file['error'][$key] != 4) {        
                if ($nonImgFiles == true) {
                    file_put_contents('file_norm_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r('There were other types of files uploaded', true), FILE_APPEND);
                } else {
                    }

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы должны добавить === false ко всем условиям и изменить оператор на &&, например:

if (
    strpos($fileTypeString,$pdf) === false && 
    strpos($fileTypeString,$jpg) === false && 
    strpos($fileTypeString,$jpeg) === false && 
    strpos($fileTypeString,$png) === false && 
    strpos($fileTypeString,$gif) === false
) {
    //do something    
} else {
   //do something
}

Но, похоже, вы можете добиться этого, используя меньше кода в этом ifделать:

$date = new DateTime();
$fu = new fileUpload();
$filename = $fu->upload();
file_put_contents('file_type_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r($uploadedFileTypes, true), FILE_APPEND);

$extensions = ['pdf', 'jpg', 'jpeg', 'png', 'gif']; //an array with your extensions
foreach ($_FILES as $file) {
    foreach($file['name'] as $key => $value) {
        if (!empty($value)) { //empty string
            if ($file['error'][$key] != 4) {
                $fileData = pathinfo($file['name']); //explod file path to array
                if (!in_array($fileData['extension'], $extensions)) { //if file extension not in your $extensions array
                    file_put_contents('file_norm_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r('There were other types of files uploaded', true), FILE_APPEND);
                } else {
                    $out = (count($filename) > 1 ? 'Multiple files were' : 'A file was'). '  uploaded. You can download ' . (count($filename) > 1 ? 'them' : 'the file'). ' from:</ul>';
                    foreach ($filename as $indFile) {
                        //print_r($template);
                        $out .= "<li><a href='/php/uploads/{$indFile}'>{$indFile}</a></li>";
                    }
                    $out .= '</ul>';
                    $template = str_replace("{filename}", $out, $template);
                }
            } else { //error code IS #4
                //echo "error code is 4";
            }
        } else {
            //echo "name is empty!";
            $template = str_replace("{filename}", '', $template);
        }
    }
}

РЕДАКТИРОВАТЬ:

Я перечитал ваш вопрос. Я считаю, что вам нужно будет удалить расширение расширение , проверяя вне цикла. Примерно так будет работать:

$date = new DateTime();
$fu = new fileUpload();
$filename = $fu->upload();
$uploadedFileTypes = $fu->getImageFileTypes();

file_put_contents('file_type_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r($uploadedFileTypes, true), FILE_APPEND);

//your per-file validation loop can go here

$extensions = 'pdf', 'jpg', 'jpeg', 'png', 'gif'];

//fill $differentExtensions with all $uploadedFileTypes elements that 
//does not exist inside $extensions
$differentExtensions = array_diff($uploadedFileTypes, $extensions);
if (count($differentExtensions) > 0) {
    file_put_contents('file_norm_log', "\n[{$date->format('Y-m-d H:i:s')}]" . print_r('There were other types of files uploaded', true), FILE_APPEND);  
} else {
    $out = (count($filename) > 1 ? 'Multiple files were' : 'A file was'). '  uploaded. You can download ' . (count($filename) > 1 ? 'them' : 'the file'). ' from:</ul>';
    foreach ($filename as $indFile) {
        //print_r($template);
        $out .= "<li><a href='/php/uploads/{$indFile}'>{$indFile}</a></li>";
    }
    $out .= '</ul>';
    $template = str_replace("{filename}", $out, $template);
}

//your per-file validation loop can go here

Цикл, который вы используете для проверки ошибок, будет отдельным блоком кода. Вы можете разместить его до или после проверки расширения файла , в зависимости от того, что вам нужно (я упомянул предложенные места в качестве комментариев в приведенном выше коде):

foreach ($_FILES as $file) {
    foreach($file['name'] as $key => $value) {
        if (empty($value)) {
            //echo "name is empty!";
            $template = str_replace("{filename}", '', $template);
        }
        if ($file['error'][$key] == 4) {
            //echo "error code is 4";
        }
    }
}
1 голос
/ 24 октября 2019

Могу ли я предложить альтернативный способ проверки типов файлов, вместо искажения строк и проверки различных переменных, иметь массив типов, которые вы хотите захватить, а затем проверить, соответствуют ли загруженные типы каким-либо из них (используя array_intersect()в этом примере) ...

$uploadedFileTypes = $fu->getImageFileTypes();
$imagesTypes = ["pdf","jpg", "jpeg", "png", "gif"];

даст вам массивы для сравнения

Тогда ваш тест будет выглядеть примерно так ...

if ( empty(array_intersect($uploadedFileTypes, $imagesTypes)) ) {

Если выЕсли вы хотите убедиться, какие типы загружены, вы можете изменить этот раунд, чтобы начать с ...

$imagesTypes = ["png","stp"];

, а затем проверить, есть ли различия между типами и ожидаемыми расширениями. ...

if ( !empty(array_diff($uploadedFileTypes, $imagesTypes)) ) {
...