PHP $ _FILES Размер Общий выпуск - PullRequest
0 голосов
/ 20 апреля 2020

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

Код:

    if (!empty($_FILES['attachment'])) { //If there are attachments
        $count = count($_FILES['attachment']['name']);
        if ($count > 0) {
            for ($i = 0; $i < $count; $i ++) {
                if (!empty($totalFileSize)){
                    $totalFileSize = 0;
                }
                //Total File Size
                if ($_FILES["attachment"]["size"][$i] != 0){
                    $totalFileSize += ($_FILES["attachment"]["size"][$i]);
                }
            }
            $message = $totalFileSize;
        }

        //Checks
        if ($totalFileSize > 20971520){
            $fileSizeError = 1;
        }
    }

    echo ''; print_r($_FILES['attachment']); echo '
'; echo $ totalFileSize; Выход();

Вывод:

Array
(
    [name] => Array
        (
            [0] => Image Today at 10_02_27.JPG
            [1] => 
        )

    [type] => Array
        (
            [0] => image/jpeg
            [1] => 
        )

    [tmp_name] => Array
        (
            [0] => /tmp/phpfJo8Fl
            [1] => 
        )

    [error] => Array
        (
            [0] => 0
            [1] => 4
        )

    [size] => Array
        (
            [0] => 982518
            [1] => 0
        )

)
0

Я не могу понять, почему дополнительный в for для l oop работает нормально, если нет 0, но не когда есть.

1 Ответ

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

Во-первых, если вы собираетесь использовать +=, вы должны инициализировать эту переменную перед выполнением первого +=

Во-вторых, у вас есть эта строка, в l oop она будет установить значение $totalFileSize в ноль, если оно существует и> 0.

if (!empty($totalFileSize)){
    $totalFileSize = 0;
}

Поэтому измените код на

$totalFileSize = 0; // init before using `+=`

if (!empty($_FILES['attachment'])) { //If there are attachments
    $count = count($_FILES['attachment']['name']);
    if ($count > 0) {
        for ($i = 0; $i < $count; $i ++) {
            //Total File Size
            if ($_FILES["attachment"]["size"][$i] != 0){
                $totalFileSize += ($_FILES["attachment"]["size"][$i]);
            }
        }
        $message = $totalFileSize;
    }
    //Checks
    if ($totalFileSize > 20971520){
        $fileSizeError = 1;
    }
}

Это можно упростить до

$totalFileSize = 0; // init before using `+=`

if (!empty($_FILES['attachment'])) { //If there are attachments
    foreach( $_FILES['attachment']['size'] as $size){
        //add up the File Sizes
        $totalFileSize += $size;
    }
    $message = $totalFileSize;
    //Checks
    if ($totalFileSize > 20971520){
        $fileSizeError = 1;
    }
}

Или даже

if (!empty($_FILES['attachment'])) { //If there are attachments
    $totalFileSize = array_sum($_FILES['attachment']['size']){
    //Checks
    if ($totalFileSize > 20971520){
        $fileSizeError = 1;
    }
}

Или даже

if (!empty($_FILES['attachment'])) { //If there are attachments
    if (array_sum($_FILES['attachment']['size']) > 20971520){
        $fileSizeError = 1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...