Javascript 带有CSV文件的CakePHP 4.x Ajax请求
我正在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)发送到控制器,遗憾的是直到现在都没有成功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
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');
}