Как передать файлы форм HTML в PHP, используя AJAX - PullRequest
0 голосов
/ 13 июля 2020

У меня есть форма с вводом типа файла. Я хочу иметь возможность захватывать изображение, прикрепленное к этому входу, в JavaScript / jQuery и передавать его моей функции PHP для последующей загрузки на мой носитель WordPress. Использование функции WordPress media_handle_upload(), которая согласно docs требует индекса массива $_FILES, который файл был отправлен в качестве первого параметра.

Вот моя попытка:

HTML

<form id="company-logo-form" method="post" action="#" enctype="multipart/form-data">
    <input type="file" name="company_logo" multiple="false" id="logo-test"/>
    <input class="btn bg green" name="upload_company_logo" type="submit" value="Upload Image" />
</form>

Javascript

$('#company-logo-form').on('submit', function(e) {
    e.preventDefault();
    let logo = $('#logo-test').prop('files');

    $.ajax({
        url: ajax_url,
        type: 'POST',
        // dataType: 'html',
        data: {
            company_logo: logo,
            action: 'uploadCompanyLogo'
        },
        error: function(res) {
            console.log(res);
        },
        success: function(res) {
            console.log(res);
        }
    });
});

PHP

add_action('wp_ajax_uploadCompanyLogo', 'update_company_logo');

function update_company_logo() {
    $logo = $_POST['company_logo'];
    $attachment_id = media_handle_upload($logo, 0);
                
    echo $attachment_id;
}

Используя этот код, когда я отправляю форму В консоли появляется следующая ошибка jQuery:

Uncaught TypeError: Illegal invocation

1 Ответ

1 голос
/ 13 июля 2020

Попробуйте использовать FormData в javascript, чтобы правильно отправить данные.

Примерно так:

$('#company-logo-form').on('submit', function(e) {
    e.preventDefault();
    let logo = $('#logo-test').prop('files')[0]; // Since 'files' is array.
    let formData = new FormData(); // Create a new form.
    formData.append('action', 'uploadCompanyLogo');
    formData.append('company_logo', logo);

    $.ajax({
        url: ajax_url,
        type: 'POST',
        data: formData,
        contentType: false, // No content type headers.
        processData: false, // Do not process sent data.
        error: function(res) {
            console.log(res);
        },
        success: function(res) {
            console.log(res);
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...