上传图像的CakePHP验证规则

时间:2013-12-05 11:44:48

标签: cakephp cakephp-2.3

在用户表单中,我有一个图片字段:

<?php echo $this->Form->file('Document.submittedfile', array('label' => __('Billede')));  ?>

我在控制器中进行了验证,但它不是最佳解决方案,因此我将其移至模型中,从那时起它就停止工作了。以下是该模型的验证片段:

    'submittedfile'=>array(
        'rule' => 'savePicture',
        'message' => 'The image has to been in jpg, png, gif or pdf format and should not exceed 2MB')

public function savePicture($data){

    if(!empty($data['Document']['submittedfile'])){

    $file = $data['Document']['submittedfile'];

    $folder_url = WWW_ROOT.'img/uploads/users/';    

    if(file_exists($folder_url . $file['name'])){
    $now = date('Y-m-d-His');
    $file['name'] = $now.$file['name'];
    }

    if($file['type'] == 'image/jpeg' || $file['type'] == 'image/png' || $file['type'] == 'image/gif' || $file['type'] == 'application/pdf' ){

     if($file['size'] <= 2097152){
        move_uploaded_file($file['tmp_name'], WWW_ROOT.'img/uploads/users/' . $file['name']);
        $this->request->data['User']['image'] = $file['name'];  

        return true;
        }else{
            return false;
        }

    }else{
        return false;
    }   

    }else{
        return false;
    }
}

现在发生的是验证规则根本没有应用。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

savePicture($ data){}中的变量$ data将类似于下面的数组。相应地更改您的代码。

  [submittedfile] => Array
    (
        [name] => sample_file
        [type] => image/jpeg
        [tmp_name] => /Applications/MAMP/tmp/php/phptU4UKh
        [error] => 0
        [size] => 132499
    )

答案 1 :(得分:0)

除了你的问题,你的代码中还有很多事情做得不好。

  • 您没有使用is_uploaded_file(),这可能会导致安全问题。
  • 当您在一个文件夹中包含大量文件时,将所有文件存储在同一文件夹中可能会导致文件系统出现性能问题。
  • 你没有使用别名,而是使用硬编码的模型名称:$ this-&gt; request-&gt; data ['User']应该是$ this-&gt; request-&gt; data [$ this-&gt; alias] - 假设您在用户模型中。
  • 您没有遵循CakePHP编码约定,不是必须的,但我更喜欢使用我使用的任何框架中的约定

关于您提出的问题:如果您想使用代码或使用完全经过单元测试的UploadValidator FileStorage plugin行为,请对代码进行单元测试。我不确定你的代码在哪里失败,我会把它分解成更多的方法(重复检查,扩展检查)和单元测试,你通常会发现错误。

您是否在验证规则中使用savePicture()作为验证方法,还是直接调用它?

https://github.com/burzum/FileStorage/blob/master/Model/Behavior/UploadValidatorBehavior.php