Zend 文件传输适配器 Http 破坏了我的 AJAX 响应,为什么?
Zend File Transfer Adapter Http is breaking my AJAX response, why?
我在 Zend Framework 1 中工作,我在控制器中有这个功能:
public function uploadAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = [];
if ($this->getRequest()->isPost()) {
$path = /cronjobs/uploads';
// Clean $path directory OOP way using SPL
$di = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($ri as $file) {
$file->isDir() ? rmdir($file) : unlink($file);
}
$adapter = new Zend_File_Transfer_Adapter_Http();
$adapter->addValidator('Extension', false, ['extension' => 'csv', 'case' => true]);
$adapter->addValidator('MimeType', false, ['extension' => 'text/plain']);
// Check if the uploaded file is valid
$errors[] = $adapter->isValid() === false ? $adapter->getMessages() : '';
$file = (array) $adapter->getFileInfo()['file'];
$ext = end(explode('.', $file['name']));
$new_path = $file['tmp_name'];
// Check file size
$checkFileSize = Attachment::checkMaxfileSize($file['size']);
if (!$checkFileSize['accept']) {
echo json_encode($checkFileSize['message']);
return true;
}
$data['file'] = array(
'name' => $file['name'],
'size' => $adapter->getFileSize(),
'file_path' => $new_path,
'file_ext' => $ext
);
$data['var'] = '';
} else {
$data['error'] = 'Invalid request.';
}
return $this->_helper->json($data);
}
这个方法通过AJAX调用如下:
$('#fileupload').show().fileupload({
url: url,
type: "POST",
cache: false,
dataType: 'json',
done: function (e, data) {
console.log(data.result);
},
error: function (xhr, textStatus, errorThrown) {
console.log(xhr + " " + textStatus + " " + errorThrown);
}
})
出于某种原因,一旦我在控制器中调用 $adapter->isValid()
,AJAX 响应就会中断。我可以说问题就在那里,因为如果我评论那段代码,一切正常。
这是我目前收到的消息:
POST http://localhost/admin/upload net::ERR_EMPTY_RESPONSE
massive_charge_types_file_upload.js:147 [object Object] error
阅读完以下所有主题后:
- net::ERR_EMPTY_RESPONSE when post with ajax
- Getting ERR_EMPTY_RESPONSE on $.POST
- PHP Jquery Ajax call throws net::ERR_EMPTY_RESPONSE
- 还有更多 Google
我没有想法,我被困住了,因为找不到导致该行为的原因。
更新:
我认为问题出在 isValid()
方法上,该方法 return 是一个布尔值,但出于某种原因,这打破了我的回应。有什么想法吗?
有人能帮我解决这个问题吗?
您的 MimeType 验证器的语法似乎有误:
$adapter->addValidator('MimeType', false, ['extension' => 'text/plain']);
大概应该是:
$upload->addValidator('MimeType', false, array('text/plain'));
如描述:
https://framework.zend.com/manual/1.12/en/zend.file.transfer.validators.html
由于您的文件无法通过(不可能的)验证测试 - 我猜这就是导致没有结果的原因?
经过几次尝试,我通过添加以下内容让它工作:
if ($adapter->isValid() === false) {
$data['error'][] = $adapter->getMessages();
echo json_encode($data);
return true;
}
我需要使用原始 json_encode()
PHP 函数,如果我使用 Zend Framework JSON 帮助程序,例如:$this->_helper->json($data)
响应无效。
我认为这是对 Jquery 插件的限制,不太严格。
我在 Zend Framework 1 中工作,我在控制器中有这个功能:
public function uploadAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$data = [];
if ($this->getRequest()->isPost()) {
$path = /cronjobs/uploads';
// Clean $path directory OOP way using SPL
$di = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($ri as $file) {
$file->isDir() ? rmdir($file) : unlink($file);
}
$adapter = new Zend_File_Transfer_Adapter_Http();
$adapter->addValidator('Extension', false, ['extension' => 'csv', 'case' => true]);
$adapter->addValidator('MimeType', false, ['extension' => 'text/plain']);
// Check if the uploaded file is valid
$errors[] = $adapter->isValid() === false ? $adapter->getMessages() : '';
$file = (array) $adapter->getFileInfo()['file'];
$ext = end(explode('.', $file['name']));
$new_path = $file['tmp_name'];
// Check file size
$checkFileSize = Attachment::checkMaxfileSize($file['size']);
if (!$checkFileSize['accept']) {
echo json_encode($checkFileSize['message']);
return true;
}
$data['file'] = array(
'name' => $file['name'],
'size' => $adapter->getFileSize(),
'file_path' => $new_path,
'file_ext' => $ext
);
$data['var'] = '';
} else {
$data['error'] = 'Invalid request.';
}
return $this->_helper->json($data);
}
这个方法通过AJAX调用如下:
$('#fileupload').show().fileupload({
url: url,
type: "POST",
cache: false,
dataType: 'json',
done: function (e, data) {
console.log(data.result);
},
error: function (xhr, textStatus, errorThrown) {
console.log(xhr + " " + textStatus + " " + errorThrown);
}
})
出于某种原因,一旦我在控制器中调用 $adapter->isValid()
,AJAX 响应就会中断。我可以说问题就在那里,因为如果我评论那段代码,一切正常。
这是我目前收到的消息:
POST http://localhost/admin/upload net::ERR_EMPTY_RESPONSE
massive_charge_types_file_upload.js:147 [object Object] error
阅读完以下所有主题后:
- net::ERR_EMPTY_RESPONSE when post with ajax
- Getting ERR_EMPTY_RESPONSE on $.POST
- PHP Jquery Ajax call throws net::ERR_EMPTY_RESPONSE
- 还有更多 Google
我没有想法,我被困住了,因为找不到导致该行为的原因。
更新:
我认为问题出在 isValid()
方法上,该方法 return 是一个布尔值,但出于某种原因,这打破了我的回应。有什么想法吗?
有人能帮我解决这个问题吗?
您的 MimeType 验证器的语法似乎有误:
$adapter->addValidator('MimeType', false, ['extension' => 'text/plain']);
大概应该是:
$upload->addValidator('MimeType', false, array('text/plain'));
如描述:
https://framework.zend.com/manual/1.12/en/zend.file.transfer.validators.html
由于您的文件无法通过(不可能的)验证测试 - 我猜这就是导致没有结果的原因?
经过几次尝试,我通过添加以下内容让它工作:
if ($adapter->isValid() === false) {
$data['error'][] = $adapter->getMessages();
echo json_encode($data);
return true;
}
我需要使用原始 json_encode()
PHP 函数,如果我使用 Zend Framework JSON 帮助程序,例如:$this->_helper->json($data)
响应无效。
我认为这是对 Jquery 插件的限制,不太严格。