PHP $ _FILES не использует все входные данные файла - PullRequest
0 голосов
/ 31 августа 2018

Я должен исправить патч PHP Mail. Дело в том, что переменная $_FILES управляет только первым вводом файла. Как все установлено, вход выглядит так: <input type="file" name="form.steps.0.field.4" />. Дело в том, что следующий вход является тем же, где имя увеличивается, например: <input type="file" name="form.steps.0.field.5" />.

При зацикливании $_FILES это текущая логика:

foreach($_FILES as $input) {
    ...
}

В этом случае $_FILES имеет только файл <input type="file" name="form.steps.0.field.4" />, тогда как второй входной файл обрабатывается как текст, и его значение равно C:\\fakepath\\ {имя_файла} .

Как мне этого добиться, не используя одно имя ввода, например <input type="file" name="files[]" />?

Edit:

var_dump из $_FILES производит следующее:

array(1) {
    ["files"]=>
        array(5) {
            ["name"]=>
                array(1) {
                    [0]=>
                    string(22) "Checklist-template.pdf"
                }
            ["type"]=>
                array(1) {
                    [0]=>
                    string(15) "application/pdf"
                }
            ["tmp_name"]=>
                array(1) {
                    [0]=>
                    string(14) "/tmp/phpZxkSFz"
                }
            ["error"]=>
                array(1) {
                    [0]=>
                    int(0)
                }
            ["size"]=>
                array(1) {
                    [0]=>
                    int(115033)
            }
        }
    }

Редактировать # 2

Добавление действия (для использования на передней и задней части):

add_action('wp_ajax_sp_form_submit', 'spForm_submit', 10, 1);
add_action('wp_ajax_nopriv_sp_form_submit', 'spForm_submit', 10, 1);

PHP, выполняющий данные:

function spForm_submit(){
    if(!(is_array($_POST) && defined('DOING_AJAX') && DOING_AJAX)){
        return;
    }
    var_dump( $_FILES );
    die();
}

JS с вызовом AJAX:

$('.sp-form .btn-submit').unbind('click').bind('click', function(e){
    e.preventDefault();
    e.stopPropagation();

    $('input[type="hidden"]', form).each(function(){
        data[$(this).attr('name')] = $(this).val();
    });

    var fd = new FormData(),
        file_inputs = $('input[type="file"]', form);

    $.each($(file_inputs), function(i, obj) {
        $.each(obj.files,function(j,file){
            fd.append('files[' + j + ']', file);
        });
    });

    function appendFormdata(FormData, data, name, cback){
        name = name || '';
        if (typeof data === 'object'){
            $.each(data, function(index, value){
                if (name === ''){
                    appendFormdata(FormData, value, index, cback);
                } else {
                    appendFormdata(FormData, value, name + '['+index+']', cback);
                }
            });
        } else {
            FormData.append(name, data);
        }
    }

    appendFormdata(fd, {form: data}, null);
    fd.append( 'action', 'sp_form_submit' );

    $.ajax({
        url         : window.forms_cback, // AJAX URL
        type        : "POST",

        data        : fd,
        contentType : false,
        processData : false,
        dataType    : "json",
        success     : function(response) {
            // removed for the purpose of the post
        }
    });
});

И вывод массива $_FILES:

array(1) {
    ["files"]=>
        array(5) {
            ["name"]=>
                array(1) {
                    [0]=>
                    string(22) "Checklist-template.pdf"
                }
            ["type"]=>
                array(1) {
                    [0]=>
                    string(15) "application/pdf"
                }
            ["tmp_name"]=>
                array(1) {
                    [0]=>
                    string(14) "/tmp/phpZxkSFz"
                }
            ["error"]=>
                array(1) {
                    [0]=>
                    int(0)
                }
            ["size"]=>
                array(1) {
                    [0]=>
                    int(115033)
            }
        }
    }

1 Ответ

0 голосов
/ 04 сентября 2018

Как указал Бармар, моя проблема была не в моем $_FILES массиве, а в опечатке в моих манипуляциях с FileData.

Цитата:

У вас есть опечатка. В fd.append('files[' + j + ']', file); переменная должна быть i, а не j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...