Php Agile Toolkit:是否可以上传文件并直接从$#u文件获取[';uploadedfile';][';tmp#u name';]?

Php Agile Toolkit:是否可以上传文件并直接从$#u文件获取[';uploadedfile';][';tmp#u name';]?,php,atk4,Php,Atk4,我用普通PHP编写了一个简单的脚本,它使用$\u FILES['uploadedfile']['tmp\u name']获取新上传的文件并直接处理其内容,而不永久存储它。其思想是允许用户上传一个包含多行数据的文件,这些数据将被PHP脚本自动解析并添加到数据库中。无需在数据库中存储文件本身或对其的引用,因为只有文件内容才是重要的。我知道,但我正在努力为用户保持干净和方便(目前我正在使用phpDesktop+sqlite进行开发,以便我的应用程序可以移植) 我现在正试图在敏捷工具包中重新创建这个过程

我用普通PHP编写了一个简单的脚本,它使用
$\u FILES['uploadedfile']['tmp\u name']
获取新上传的文件并直接处理其内容,而不永久存储它。其思想是允许用户上传一个包含多行数据的文件,这些数据将被PHP脚本自动解析并添加到数据库中。无需在数据库中存储文件本身或对其的引用,因为只有文件内容才是重要的。我知道,但我正在努力为用户保持干净和方便(目前我正在使用phpDesktop+sqlite进行开发,以便我的应用程序可以移植)

我现在正试图在敏捷工具包中重新创建这个过程,但我似乎不知道该怎么做。我知道
文件存储
模型在移动/重命名文件之前必须访问
['tmp_name']
,但我不知道如何仅获取此功能。我试着查看
/lib/Form/Field/Upload.php
中的任何方法是否有用,但我对php非常陌生,所以这些文档让我感到困惑
getFilePath()
看起来很有希望,但当我执行以下操作时,$\u文件似乎仍然是空的:

$form = $page->add('Form');
$upl = $form->addField('Upload', 'file');
$form->addSubmit();

if ($form->isSubmitted()){
    $form->js()->univ()->alert($upl->isUploaded())->execute(); //sends js alert('false')
}
我意识到AJAX不能用于发布文件,我有一种感觉,这是问题的一部分,但我真的不确定从这里走到哪里。任何帮助都将不胜感激


谢谢

AgileToolkit会在选择文件后立即上传它——将其立即移动到文件存储中并创建数据库记录,所以这并不是您真正需要的

用普通PHP编写的任何东西也可以与敏捷工具包一起使用。您可以通过以下操作禁用表单中的JavaScript:

$this->add('Form',array('js_widget'=>false));

这样的表格将向您发送一个正常的邮寄请求

好的,我通过创建
Form\u Field\u Upload
的自定义扩展并在其中重新定义
loadPOST()
方法,实现了我想要的

function loadPOST(){
    Form_Field::loadPOST();

    if($_GET[$this->name.'_upload_action']){
        // This is JavaScript upload. We do not want to trigger form submission event
        $_POST=array();
    }
    if($_GET[$this->name.'_upload_action'] || $this->isUploaded()){
        if($this->model){
            try{
            $model=$this->model;

            /*Function is identical to parent above this line*/

            //process file here and do $model->set('custom_field',$value);
            //I am using $this->getFilePath() to analyze the uploaded file

            /*Function is identical to parent below this line*/

            $model->save();

            }catch(Exception $e){
                $this->api->logger->logCaughtException($e);
                $this->uploadFailed($e->getMessage()); //more user friendly
            }

            $this->uploadComplete($model->get());
        }
    }
    if($_POST[$this->name.'_token']){
        $a=explode(',',$_POST[$this->name.'_token']);$b=array();
        foreach($a as $val)if($val)$b[]=$val;
        $this->set(join(',',filter_var_array($b,FILTER_VALIDATE_INT)));
    }
    else $this->set($this->default_value);
}

我确信这不是最优雅的解决方案,但它对我的目的起到了作用。

谢谢。我得到了我想要的结果,但这是一个丑陋的解决方案,见下文。