为什么admin-ajax.php中的$_REQUEST是空数组?

时间:2018-03-20 作者:Tarik Druskic

我正在尝试使用AJAX上传文件,我正在挂接我的函数,以便在admin AJAX中调用它们。我不能让它工作得很艰难,我也不知道到底出了什么问题,也不知道该去哪里看。然而,我通过修改管理ajax缩小了范围。php一点:

// Require an action parameter
if ( empty( $_REQUEST[\'action\'] ) ) {
    $response = array(
        \'error\' => \'no action parameter\',
        \'req\' => var_export( $_REQUEST, true )
    );
    wp_send_json( $response );
    wp_die( \'0\', 400 );
}
我的AJAX请求中有数据类型:“json”,因此会调用我的success函数(如果我删除$response声明和对wp\\u send\\u json的调用,则会调用错误一,将整个页面作为响应返回,状态文本为“parserror”)。

总之,下面是我的AJAX脚本:

    $( \'#user-file\' ).change( function( event ) {
        var formData = new FormData();
        formData.append( "userfile", $(this)[0].files[0] );
        formData.append( "action", "vibesoft_files_upload" );
        formData.append( "_wpnonce", vbsoft.nonce_upload );

        console.log( formData );

        $.ajax({
            type: "post",
            url: vbsoft.ajax_url,
            data: formData,
            contentType: "multipart/form-data",
            processData: false,
            dataType: \'json\',

            success: function( data ) {
                if ( data.error != \'none\' ) {
                    console.log( \'Error: \' + data.error );
                    console.log( \'Request: \' + data.req );
                    return;
                }
它不是整个函数,它被包装在(function($) { ... })(jQuery); 所以我可以用$代替jQuery。这个console.log( \'Request: \' + data.req ); 输出:

Request: array(
)
我还尝试输出$\\u POST和$\\u文件,它们也是空数组。如果我使用(而不是JSON返回)返回它们:

var_dump( $_REQUEST );
exit;
我明白了array(0) {} 回到控制台。

所以,是的,我不知道为什么我得到一个空数组。。。

2 个回复
SO网友:Tom J Nowell

问题是:

    var formData = new FormData();
    formData.append( "userfile", $(this)[0].files[0] );
    formData.append( "action", "vibesoft_files_upload" );
    formData.append( "_wpnonce", vbsoft.nonce_upload );

    console.log( formData );

    $.ajax({
        type: "post",
        url: vbsoft.ajax_url,
        data: formData,
具体而言:

    var formData = new FormData();
jQuery文档中没有这样说data 接受FormData 对象的data 参数:

数据类型:要发送到服务器的纯对象或字符串或数组数据。如果尚未转换为字符串,则会将其转换为查询字符串。它被附加到GET请求的url中。请参阅processData选项以阻止此自动处理。对象必须是键/值对。如果value是一个数组,jQuery将基于传统设置的值(如下所述)用相同的键序列化多个值。

https://api.jquery.com/jQuery.ajax/

解决方案是使用对象,例如:

var formData = {
    "userfile": $(this)[0].files[0],
    "action": "vibesoft_files_upload",
    "_wpnonce": vbsoft.nonce_upload
};
请记住,如果您使用了更简单的REST API,并指定了所需的字段,那么API会直截了当地告诉您问题所在以及缺少哪些字段。REST API更易于使用,所遇到的问题和挂起的问题要少得多

因此,已经有了一个核心端点,它可能能够完成您想要做的事情,请参见https://developer.wordpress.org/rest-api/reference/media/

SO网友:Tarik Druskic

解决了!

我最终使用FormData对象并更改了$。ajax调用:

$.ajax({
            method: \'post\',
            processData: false,
            contentType: false,
            cache: false,
            data: form_data,
            enctype: \'multipart/form-data\',
            url: custom.ajaxURL,

结束

相关推荐

使用AJAX发出POST请求会返回400错误(不使用jQuery)

该网站有一个带有搜索字段和类别复选框的博客页面。搜索某个内容或选中/取消选中某个类别会启动AJAX请求,以根据搜索/类别获取帖子,然后将这些结果填充到页面上的列表中。Currently this functionality works with jQuery, but my attempts to write it in plain JS are failing with 400 errors.以下是对此的jQuery:$.ajax({ url: Knuckle.ajaxurl,