PHP - Цикличное выполнение через $ _FILES для проверки типа файла

Очевидный ответ: см. CSS Zen Garden . Если вы скажете мне, что вы можете легко сделать то же самое с макетом на основе таблиц (помните - HTML не меняется), тогда непременно используйте таблицы для макета.

Две другие важные вещи - это доступность и SEO.

Обе заботятся о том, в каком порядке представлена ​​информация. Вы не можете легко представить свою навигацию в верхней части страницы, если макет на основе таблицы помещает ее в 3-ю ячейку 2-й строки 2-й вложенной таблицы на странице.

Итак, ваши ответы - ремонтопригодность, доступность и SEO.

Не ленись. Делайте вещи правильно и правильно, даже если их немного сложнее освоить.

7
задан Stann0rz 17 July 2009 в 14:11
поделиться

7 ответов

Оператор && имеет более высокий приоритет , чем ||, поэтому вместо (A OR B OR C) AND D , как вы предполагали, это на самом деле A OR B OR (C AND D)

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

Однако что-то вроде этого может быть более понятным и более легким для обслуживания / чтения:

$allowed_types=array(
    'image/gif',
    'image/jpeg',
    'image/png',
);


$sscount = $_POST['imgcount'];
if($sscount>0){
    for($i = 1; $i <= $sscount; $i++){

        if (in_array($_FILES["image$i"]["type"], $allowed_types) && 
            ($_FILES["image$i"]["size"] < 500000))
        {

        }

    }
}
9
ответ дан 6 December 2019 в 08:16
поделиться

Это не прямой ответ на ваш вопрос, но вы можете передавать значения формы в PHP в виде массива, который будет проще обрабатывать. in_array () также полезен для проверки того, что значение находится в разрешенном списке.

HTML:

<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">

PHP:

<?php
if (isset($_FILES['image'])) {
    foreach ($_FILES['image'] as $file) {
        if (!in_array($file['type'], array("image/gif", "image/jpeg", "image/png"))
           || $file['size'] > 500000) {
           //error
        } else {
           //ok
        }
    }
}
5
ответ дан 6 December 2019 в 08:16
поделиться

Как уже упоминалось, способ, которым вы сгруппировали свои условные выражения, был неправильным. Однако вместо того, чтобы просто добавить скобки, я Я предлагаю вам полностью разделить два условия;

// this declaration + the use of in_array() isn't necessary,
// it just makes things a bit cleaner.
$file_types = array("image/gif","image/jpeg","image/png"); 

if($_FILES["image$i"]["size"] < 500000)
{
    if(in_array($_FILES["image$i"]["type"], $file_types)))
    {
        // do stuff
    }
    else
    {
        // error about file type
    }
}
else
{
    // error about file size
}

Такое разделение делает код более читабельным и упрощает иерархию условий, ПЛЮС это позволяет вашим сообщениям об ошибках быть более значимыми. Рекомендуется разделять условные операторы разных типов, чтобы любые сообщения об ошибках оставались полезными. Если ваш код выдал ошибку как таковой, пользователь не сможет узнать (не думая о себе), было ли его изображение слишком большим или неправильного типа.

4
ответ дан 6 December 2019 в 08:16
поделиться

Ну, ваша логическая логика неоднозначна и, вероятно, не делает то, что вы хотите. Это, вероятно, сработает лучше:

    if ((($_FILES["image$i"]["type"] == "image/gif")
    || ($_FILES["image$i"]["type"] == "image/jpeg")
    || ($_FILES["image$i"]["type"] == "image/png" ))
    && ($_FILES["image$i"]["size"] < 500000))

Хотя, если бы у меня были мои друтеры, все выглядело бы так:

    $file = $_FILES['image' . $i];
    $type = $file['type'];
    if(($type == 'image/gif' || $type == 'image/jpeg' || $type == 'image/png') && $file['size'] < 500000)
2
ответ дан 6 December 2019 в 08:16
поделиться

Я не думаю, что вам действительно нужна переменная, которая обновляется с помощью Javascript. Вы можете использовать PHP, чтобы определить, сколько файлов было загружено, проверив код ошибки . Вы можете обрабатывать загрузку файлов, также проверив расширение файла, поскольку разные браузеры часто могут отправлять разные типы MIME. Вот пример того, о чем я говорю:

$accepted_files = array(
    'jpg',
    'png',
    'gif',
    'jpeg'
);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    foreach($_FILES as $key => $upload) {
        if ($upload['error'] == 0) {
            $file_parts = explode ('.',$upload['name']);
            if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) {
                // This type of file is a-ok
            }
            else {
                // Not an accepted file type
            }
        }
    }
}   
2
ответ дан 6 December 2019 в 08:16
поделиться

Вы можете объединить все ['type'] == x || ['type'] == y за один вызов in_array ($ _ FILES [...] ['type'], $ allowed)>

$ _ FILES [..] ['type'] содержит данные, отправленные клиентом, которые не проверяются и не обрабатываются php. Если тип файла имеет какое-либо значение, не полагайтесь на $ _FILES [..] ['type'] или суффикс $ _FILES [..] ['name']. Имеет значение только фактическое содержание. При необходимости вы можете проверить это с помощью расширения fileinfo или mime_content_type () (которое помечено как устаревшее в пользу fileinfo)

0
ответ дан 6 December 2019 в 08:16
поделиться

Я думаю, что ваше if условное выражение неверно. Вам нужны скобки вокруг первой группы логических значений, объединенных операцией ИЛИ, например:

   if ( (($_FILES["image$i"]["type"] == "image/gif")
    || ($_FILES["image$i"]["type"] == "image/jpeg")
    || ($_FILES["image$i"]["type"] == "image/png" ))
    && ($_FILES["image$i"]["size"] < 500000))

Это правильно означает, «если файл является изображением (gif, jpeg или png) И меньше этого размера».

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

0
ответ дан 6 December 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: