Javascript 带有CSV文件的CakePHP 4.x Ajax请求

Javascript 带有CSV文件的CakePHP 4.x Ajax请求,javascript,jquery,ajax,csv,cakephp-4.x,Javascript,Jquery,Ajax,Csv,Cakephp 4.x,我正在CakePHP4.x中开发一个响应性用户界面,它偶尔会使用Ajax请求。 我的Ajax请求执行得很好,但是在请求中加入CSV文件以便我的控制器能够处理数据时遇到了很多问题。我想要完成的是,我可以选择一个CSV文件,按submit,Ajax请求将文件发送到控制器,并使用独立的行更新数据库 我的代码: 脚本: 经过一些研究,我发现我可以使用FormData对象来发送文件。我当时收到的错误是“非法调用”。经过进一步的研究,我发现这与Ajax的自动字符串解析有关。根据其他一些StackOverfl

我正在CakePHP4.x中开发一个响应性用户界面,它偶尔会使用Ajax请求。 我的Ajax请求执行得很好,但是在请求中加入CSV文件以便我的控制器能够处理数据时遇到了很多问题。我想要完成的是,我可以选择一个CSV文件,按submit,Ajax请求将文件发送到控制器,并使用独立的行更新数据库

我的代码:

脚本:

经过一些研究,我发现我可以使用FormData对象来发送文件。我当时收到的错误是“非法调用”。经过进一步的研究,我发现这与Ajax的自动字符串解析有关。根据其他一些StackOverflow帖子,我可以通过将processdata和contenttype属性设置为false来解决这个问题。这修复了问题,但导致Ajax请求始终为空(不包含任何数据)。我在没有CSV文件的情况下用一个常规数据对象测试了它,该对象包含一个带字符串的变量,但也导致了一个空请求(没有数据发送到控制器)

因此,我的问题是,如果processdata属性不为false,则会出现“非法调用”错误,否则,如果processdata为false,则不会在控制器中接收任何数据。我正在寻找解决此问题的解决方案,以便将我的CSV文件或至少文件中的数据发送到我的控制器

除使用FormData之外的其他解决方案也很受欢迎,例如,我试图用Javascript读取CSV文件,并将其转换为另一个对象(使用jquery CSV api)发送到控制器,遗憾的是直到现在都没有成功

function importProducts() {
    /* Getting form data */
    let form = document.getElementById('importProductsForm');

    let formData = new FormData();

    let file = $(form.products_file).prop('files')[0];

    formData.append("csv_file", file);

    /* Moving product stock */
    ajaxRequest('Products', 'importProducts', formData, processImportProducts);
}

function ajaxRequest(controller, action, data = null, callback = null) {
    $.ajax({
        url : "<?=$this->Url->build(['controller' => '']);?>" + "/" + controller + "/" + action,
        type : 'POST',
        data : {
            'data': data
        },
        dataType :'json',
        /*processData: false,*/
        /*contentType: false,*/
        success : function(dataArray) {    
            let response = dataArray.response;
            
            if (typeof response.data !== 'undefined') {
                data = response.data;
                
                if (callback != null) {
                    callback(data);
                }
            } else if (response.success == 0) {
                data = null;
                
                giveError(response.errorTemplate);
            } else {
                data = null;
                
                if (callback != null) {
                    callback(data);
                }
            }
        },
        error : function(request,error)
        {
            console.error(error);
        }
    });
}
public function importProducts() {
    $this->RequestHandler->renderAs($this, 'json');

    $response = [];

    if($this->request->is('post')) {
        $data = $this->request->getData();

        $response['test'] = $data;
    } else {
        $response['success'] = 0;
    }

    $this->set(compact('response'));
    $this->viewBuilder()->setOption('serialize', true);
    $this->RequestHandler->renderAs($this, 'json');
}