【问题标题】:Agile Toolkit: Any way to upload files and fetch directly from $_FILES['uploadedfile']['tmp_name']?敏捷工具包:有什么方法可以上传文件并直接从 $_FILES['uploadedfile']['tmp_name'] 获取?
【发布时间】:2014-02-27 03:23:52
【问题描述】:

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

我现在正尝试在 Agile Toolkit 中重新创建此过程,但我似乎无法弄清楚如何。我知道filestore 模型必须在移动/重命名文件之前访问['tmp_name'],但我不知道如何只挖掘这个功能。我尝试查看 /lib/Form/Field/Upload.php 以查看是否有任何方法可能有用,但我对 PHP 很陌生,所以这些文档让我感到困惑。 getFilePath() 看起来很有希望,但是当我执行以下操作时,$_FILES 似乎仍然是空的:

$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 不能用于发布文件,我觉得这是问题的一部分,但我不确定从哪里开始。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: php atk4


    【解决方案1】:

    Agile Toolkit 会在文件被选中后立即上传 - 立即将其移动到文件存储中并创建数据库记录,因此并不是您真正需要的。

    您用普通 PHP 编写的任何东西都可以使用 Agile Toolkit。您可以通过以下方式禁用表单中的 JavaScript:

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

    这样的表单会向您发送一个普通的 POST 请求。

    【讨论】:

    • 谢谢。我得到了我想要发生的事情,但这是一个丑陋的解决方案,见下文。
    【解决方案2】:

    好的,通过创建Form_Field_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);
    }
    

    我确定这不是最优雅的解决方案,但无论如何它都符合我的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      相关资源
      最近更新 更多