Zend文件传输适配器HTTP打破了我的Ajax响应,为什么



我在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 with ajax
  • 发布
  • 在$ .post上获取err_empty_response
  • php jquery ajax呼叫投掷net :: err_empty_response
  • 以及Google中的更多内容

我没有想法,因为找不到导致行为的原因,所以我被困了。

更新:

我相信问题是在isValid()方法上返回布尔值,但由于某种原因,这打破了我的响应。有什么想法吗?

可以帮助我吗?

看来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;
}

我需要使用RAW json_encode() PHP函数,如果我使用Zend Framework JSON助手,例如:$this->_helper->json($data)响应不起作用。

我相信这是jQuery插件不确定的限制。

最新更新