You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用media_handle_upload上传图片至WordPress服务器失败求助

WordPress竞赛申请功能图片上传报错:Specified file failed upload test.

开发WordPress竞赛申请功能时,未授权用户完成支付后通过AJAX以FormData格式提交表单,PHP端可成功创建gallery类型帖子,但调用media_handle_upload上传图片时失败,报错提示:Specified file failed upload test.

相关代码

前端代码

  1. 支付数据获取函数
function getPayData() {
    var payData = {};
    payData['gallery-parent-id'] = {};
    payData['gallery-parent-id']['value'] = form.dataset.parent;
    payData['form-id'] = {};
    payData['form-id']['value'] = form.dataset.id;
    return payData;
}
  1. 支付成功后的AJAX提交逻辑
$.ajax({
    url: url,
    type: 'POST',
    data: payData,
    success: function(response) {
        var response_end = JSON.parse(response);
        var confirmationToken = response_end.confirmation_token;
        var order_id = response_end.id;
        var amount = response_end.amount;
        if (confirmationToken) {
            const checkout = new window.YooMoneyCheckoutWidget({
                customization: {
                    control_primary: '#81fdc5'
                },
                error_callback: function(error) {
                }
            });
            checkout.on('success', () => {
                formData.append('order id:', order_id);
                formData.append('amount:', amount);
                const success_url = '/pay/success-pay-handler.php';
                $.ajax({
                    url: success_url,
                    type: 'POST',
                    data: formData,
                    cache       : false,
                    dataType    : 'json',
                    processData : false,
                    contentType : false,
                    success: function(response) {
                        console.log(response);
                    },
                    error: function(response) {
                        console.log(response);
                        console.error('Error data send.');
                    }
                });
                checkout.destroy();
            });
            checkout.render('payment-form');
            setTimeout(function() {
            }, 300);
        } else {
            console.log('No token')
        }
    },
    error: function() {
        console.error('Errror data send.');
    }
});
  1. FormData构建逻辑
formData = new FormData();
for (var i = 0; i < form.elements.length; i++) {
    var element = form.elements[i];
    if (element.type === 'text' || element.type === 'textarea' || element.type === 'number' || element.type === 'mail') {
        var label = document.querySelector('label[for="' + element.name + '"]');
        var name = element.name;
        var title = label.textContent.trim();
        var value = element.value;
        var valueWithLabel = [title, value];
        formData.append(name, valueWithLabel);
    } else if (element.type === 'file') {
        var name = element.name;
        formData.append(name, element.files[0]);
    }
}

PHP处理代码

require_once( $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php' );
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
$formData = $_POST;
$formFiles = $_FILES;
$artFiles = array();
foreach ($formFiles as $key => $file) {
    if (strpos($key, "art-file-") === 0) {
        $artFileNumber = substr($key, strlen("art-file-"));
        $artFiles[$artFileNumber] = $file;
    }
}
// 遍历获取artNames等代码省略
foreach ($artNames as $artNameNumber => $artName) {
    $artFile = isset($artFiles[$artNameNumber]) ? $artFiles[$artNameNumber] : '';
    $post_data = array(
        'post_type' => 'gallery',
        'post_status' => 'draft',
        'post_parent' => $parent_page_id,
        'post_title'     => $artName,
        'post_content' => $artFile['name'] . ' : ' . $artFile['tmp_name'] . ' : ' . $artFile['size']
    );
    $post_id = wp_insert_post($post_data);
    update_post_meta($post_id, '_wp_page_template', 'single-cat-gallery.php');
    // 错误写法
    $attachment_id = media_handle_upload( $artFile, $post_id );
    if ( is_wp_error( $attachment_id ) ) {
        $error_message = $attachment_id->get_error_message();
        echo json_encode( array( 'error' => $error_message ) );
    }
    update_post_meta( $post_id, '_thumbnail_id', $attachment_id );
}

错误信息

返回的错误内容:

"{"error":"Specified file failed upload test."}{"error":"Specified file failed upload test."}"

问题解决

经排查,media_handle_upload函数的第一个参数要求传入$_FILES数组中的文件键名,而不是直接传入文件数组。修改PHP中的上传代码为:

$attachment_id = media_handle_upload( 'art-file-' . $artNameNumber, $post_id );

内容的提问来源于stack exchange,提问作者nvrndev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:35:54