如何在Wordpress中使用AJAX正确发送FormData?

时间:2018-03-18 12:49:54

标签: javascript php jquery ajax wordpress

我一直在阅读Stack Overflow上的很多问题并实现答案。似乎没有什么工作,艰难。我想允许用户上传文件,并且我设法在没有AJAX的情况下实现它。它只是一个PHP脚本(PHP,Javascript,CSS)。在分离所有内容以清理它的同时,我决定尝试使用AJAX。

这是指向我的javascript文件的链接:AJAX

该文件还包含一个要删除的AJAX请求。但是,我现在不担心它是否有效。

这里是upload.php的链接:upload.php

这个PHP文件不是直接调用的,我把它挂钩到一个动作钩子中,如下所示:

add_action( 'wp_ajax_vibesoft_files_upload', 'vibesoft_files_upload' );
function vibesoft_files_upload() {
    include 'upload.php';
}

此代码随后包含在我的活动主题的functions.php中。

编辑:忘记包含打印到控制台的内容: enter image description here

编辑2: 找到了可能的线索!好极了!这是来自admin-ajax.php的代码片段:

// Require an action parameter
if ( empty( $_REQUEST['action'] ) )
    wp_die( '0', 400 );

由于我在控制台日志中返回了400,我将400更改为666.成功函数已运行,但我的AJAX脚本检查失败:

if ( typeof data == 'object' ) {
    console.log( 'data is JSON' );
}

在下一行,有:

console.log( data )

其中打印单个0和admin-ajax在其末尾有一个wp_die(' 0')。

编辑3: 所以,我已经改变了$ .ajax调用:

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

$.ajax({
    type: "POST",
    url: vbsoft.ajax_url,
    data: formData,
    contentType: false,
    processData: false,
    dataType: 'JSON',

当然,这不是完整的功能。我改变的是我如何准备FormData以及发生的新事物是: 如果我删除了dataType:' JSON'从代码中,我得到一个完整的页面作为回应(我不知道哪一个,那里有很多HTML和我得到的东西)。如果我保留数据:' JSON'在那里,我得到一个带有statusText的对象:" parseerror"和responseText:" the_entire_page_here"

第一行,之后

wp_send_json( array( 'error' => 'Test' ) );

为什么我没有收到JSON?

编辑4:

好的,尝试将所有$更改为jQuery - 仍然没有变化。为了调试目的,我稍微修改了我的admin-ajax.php:

// Require an action parameter
if ( empty( $_REQUEST['action'] ) ) {
    wp_send_json( array( 'error' => 'no action parameter' ) );
    wp_die( '0', 400 );
}

现在,我正在收回JSON。甜!所以,我不知道在我的数据中发送了一个动作参数。我不明白。我在网上看过几个使用formData.append的例子(" action"," action_name_without_wp_ajax");在各个地方。

编辑5:

我一直在查看Chrome开发工具的网络标签。 contentType: false

如果我设置contentType:false,那么我在响应标头中得到了什么,如果我将其设置为contentType:" multipart / form-data",我得到:

contentType: "multipart/form-data"

1 个答案:

答案 0 :(得分:0)

请考虑将所有“$”更改为“jQuery”