Проблемы с доступом к файлам, загруженным с помощью Plupload - PullRequest
0 голосов
/ 24 марта 2011

Мы используем плагин для загрузки нескольких файлов, и мы хотим сохранить его на сервере с помощью move_uploaded_file () и отправить письмо с прямой ссылкой на все файлы после успешной загрузки.Мы получаем следующий массив ...

Array
(
    [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg
    [html5_uploader_0_name] => show_041.jpg
    [html5_uploader_0_status] => done
    [html5_uploader_1_tmpname] => p15rkfr8mb1plfu4q1giu3v01jl74.jpg
    [html5_uploader_1_name] => 23.jpg
    [html5_uploader_1_status] => done
    [html5_uploader_count] => 2
)

И мы используем следующий код ...

    $("#html5_uploader").pluploadQueue({
    // General settings
    runtimes : 'html5',
    url : 'upload.php',
    max_file_size : '10mb',
    chunk_size : '1mb',
    unique_names : true,
    filters : [
        {title : "Image files", extensions : "jpg,gif,png"},
        {title : "Zip files", extensions : "zip"}
    ],

    // Resize images on clientside if we can
    //resize : {width : 320, height : 240, quality : 90}
});

}

, поэтому проблема в том, что мы должны передатьвместо $ _FILES ["file"] ["tmp_name"] и $ _FILES ["file"] ["name"] в случае этого массива.

Ответы [ 2 ]

3 голосов
/ 24 марта 2011

Спасибо за обновленный пост.

Если в одной форме происходит несколько загрузок файлов , которые имеют имя элемента в формате массива , $_FILES становится все шатким. Вместо добавления другого слоя между именем элемента формы и информацией о файле, он добавляет еще один слой после информации о файле .

Может быть, лучше визуализировать это:

array(
    'name' => array(
        0 => 'foo.gif',
        1 => 'bar.jpeg'
    ),
    'tmp_name' => array(
        0 => '/tmp/something',
        1 => '/tmp/else',
    )
);

Не то, что вы ожидали, верно?

Теперь ваш код делает что-то совершенно бессмысленное. Вы перебираете $_POST, но затем обрабатываете $_FILES. Вещи не работают таким образом.

У меня нет понятия , где вы получаете исходный массив, который вы разместили, поэтому я его проигнорирую.

Давайте представим, что 'file' - это имя элемента формы многофайловой загрузки, а полностью перестроит массив $_FILES :

$fixed_files = array();
foreach($_FILES['file'] as $expected => $unexpected) {
    foreach($unexpected as $index => $data)
        $fixed_files[$index][$expected] = $data;
}

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

Там. Теперь мы можем перебрать $fixed_files, как мы могли бы с самого начала:

foreach($fixed_files as $uploaded) {
    $safe_name = preg_replace('/[^A-Za-z0-9_-\.]/', '', $uploaded["name"]);
    move_uploaded_file($uploaded["tmp_name"], "upload/" . $safe_name);
    $links[] = "upload/" . $safe_name;
}

Обратите внимание на новое дополнение к вашему предыдущему коду - $safe_name. Элемент name массива исходит от пользователя и ему нельзя доверять. Регулярное выражение удаляет все, кроме букв, цифр, тире, подчеркиваний и точек.

Вам также следует больше проверять загруженные данные, если можете! Например, если вы ожидаете изображения, вы должны попытаться проверить, действительно ли файлы являются изображениями. Если вы используете PHP 5.3, проверьте finfo_file. Вы можете использовать его, чтобы получить MIME-тип файла и убедиться, что вы можете работать с ним.

0 голосов
/ 02 июня 2013

Вывод, который вы получаете после публикации, сохраняется в $ _POST, откуда берется отображаемый вами массив.

Чтобы более эффективно использовать вывод массива $ _POST, сначала необходимо изменить вывод сообщений формы в многомерный массив / вывод.

То, как я это сделал, изменилось, когда файл .js plupload создает html-форму в составную форму. Используя следующий метод PHP страница множественной загрузки в руководстве по PHP , как упоминалось @Charles.

Пример строк, которые я редактировал ниже, используя скобки '[]' вокруг счетчика и имя значения в тегах «name», которое разбивает данные $ _POST на многомерный массив.

    if (file.target_name) {
    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][tmpname]" value="' + plupload.xmlEncode(file.target_name) + '" />';
    }

    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][name]" value="' + plupload.xmlEncode(file.name) + '" />';
    inputHTML += '<input type="hidden" name="' + id + '[' + inputCount + '][status]" value="' + (file.status == plupload.DONE ? 'done' : 'failed') + '" />';

Что превращает это:

Array
(
    [html5_uploader_0_tmpname] => p15rkfr6oogdt1ln91t0r4obrrh3.jpg
    [html5_uploader_0_name] => show_041.jpg
    [html5_uploader_0_status] => done
    [html5_uploader_1_tmpname] => p15rkfr8mb1plfu4q1giu3v01jl74.jpg
    [html5_uploader_1_name] => 23.jpg
    [html5_uploader_1_status] => done
    [html5_uploader_count] => 2
)

В это:

array
  'uploader' => 
    array
      0 => 
        array
          'tmpname' => string 'p15rkfr6oogdt1ln91t0r4obrrh3.jpg'
          'name' => string 'show_041.jpg'
          'status' => string 'done'
      'count' => string '1'

Затем вы можете использовать местоположение, в котором Plupload сохраняет временные (tmp) файлы, найденные в 'Upload.php' вместе с tmpname $_POST['tmpname'], чтобы переместить файл.

    $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
    move_uploaded_file($targetDir . $_POST['tmpname'], $destination);
...