Загрузка нескольких файлов с помощью PHP - PullRequest
1 голос
/ 15 января 2010

Это моя разметка HTML:

<p><input type="file" name="file[]" id="file" /></p>
<p><input type="file" name="file[]" id="file" /></p>
<p><input type="file" name="file[]" id="file" /></p>
<p><input type="file" name="file[]" id="file" /></p>
<p><input type="file" name="file[]" id="file" /></p>

Когда я отправляю форму, она отправляет пустые файлы. Это print_r массива, который он отправляет:

Array
(
    [name] => Array
        (
            [0] => thumb.jpg
            [1] => 
            [2] => 
            [3] => 
            [4] => 
        )

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

    [tmp_name] => Array
        (
            [0] => C:\xampp\tmp\phpEE16.tmp
            [1] => 
            [2] => 
            [3] => 
            [4] => 
        )

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

    [size] => Array
        (
            [0] => 5130
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
        )

)

Есть ли способ остановить отправку всех этих пустых файлов? Поскольку у меня есть ощущение, что от этого сценария у меня будет головная боль. Я думал, что смогу проверить код ошибки для каждого файла (4, если файла нет), а затем удалить его из массива, как вы думаете?

Ответы [ 4 ]

1 голос
/ 15 января 2010

ПОЦЕЛУЙ. Просто проверьте коды ошибок и покончите с этим.
Нет простого способа обойти это, поскольку пользователи (вы знаете, они глупы) будут пытаться загрузить, иногда только в последнюю позицию, или могут быть в первой и третьей позиции ... вы понимаете, что у меня дрейф.
B.T.W Есть много готовых классов, которые могут обработать это для вас.

0 голосов
/ 15 января 2010

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

0 голосов
/ 15 января 2010

Возможно, вы могли бы проверить значения полей (input.value != "") перед отправкой формы и удалить их из DOM, если они пусты.

Или на стороне сервера проверьте код ошибки по UPLOAD_ERR_NO_FILE константе.

0 голосов
/ 15 января 2010

Один из способов сделать это - иметь только один вход для загрузки файла и кнопку +, которая вызывает функцию JavaScript, которая добавляет другой (и еще один ...) вход для загрузки файла.

Я не понимаю, почему дополнительные значения массива могут вызвать проблемы, просто используйте универсальную функцию загрузки, подобную следующей, и у вас все будет хорошо:

function Upload($source, $destination)
{
    $result = array();

    if (array_key_exists($source, $_FILES) === true)
    {
        $destination = str_replace('\\', '/', realpath($destination));

        if (is_array($_FILES[$source]['error']) === true)
        {
            foreach ($_FILES[$source]['error'] as $key => $value)
            {
                if ($value == UPLOAD_ERR_OK)
                {
                    if (move_uploaded_file($_FILES[$source]['tmp_name'][$key], $destination . basename($_FILES[$source]['name'][$key])) === true)
                    {
                        $result[] = $destination . basename($_FILES[$source]['name'][$key]);
                    }
                }
            }
        }

        else
        {
            if (move_uploaded_file($_FILES[$source]['tmp_name'], $destination . basename($_FILES[$source]['name'])) === true)
            {
                $result[] = $destination . basename($_FILES[$source]['name']);
            }
        }
    }

    return $result;
}
...