CakePHP验证文件上传

时间:2013-09-10 23:51:17

标签: php validation cakephp file-upload

我正在尝试使用cake 2.3.8对文件上传进行验证,以确保只能上传PDF。我基于this教程轻松地做了这个。

我的表单在输入旁边显示星号,当我从模型中删除验证时,星号消失了。我假设这意味着它“看到”输入进行验证,但我无法弄清楚为什么即使自定义验证也没有被触发。

这是表格

echo $this->Form->create('Upload', array('type' => 'file'));
echo $this->Form->input('file_upload', array('type' => 'file'));
echo $this->Form->input('file_title');
echo $this->Form->end(__('Upload File!', true));

以下是我上传模型中的代码

public function checkUpload(){
    echo "test";   //check to see if it reaches this...not displaying
    return false;  //the error message should be set just for testing, it's not displaying though
}


public $validate = array(
    'file_upload' => array(
        'extension' => array(
            'rule' => array('extension', array('pdf')),
             'message' => 'Only pdf files',
         ),
         'upload-file' => array(
                 'rule' => array('checkUpload'),
                 'message' => 'Error uploading file'
          )
    )
);

2 个答案:

答案 0 :(得分:2)

这是我的回答(虽然是cakephp 1.3):

model中将以下validation添加到$validate变量中。

$this->validate = array(...

    // PDF File
    'pdf_file' => array(
        'extension' => array(
            'rule' => array('extension', array('pdf')),
            'message' => 'Only pdf files',
        ),
        'upload-file' => array(
            'rule' => array('uploadFile'), // Is a function below
            'message' => 'Error uploading file'
        )
    )

); // End $validate


/**
 * Used when validating a file upload in CakePHP
 *
 * @param Array $check Passed from $validate to this function containing our filename
 * @return boolean True or False is passed or failed validation
 */
public function uploadFile($check)
{
    // Shift the array to easily acces $_POST
    $uploadData = array_shift($check);

    // Basic checks
    if ($uploadData['size'] == 0 || $uploadData['error'] !== 0)
    {
        return false;
    }

    // Upload folder and path
    $uploadFolder = 'files'. DS .'charitylogos';
    $fileName = time() . '.pdf';
    $uploadPath =  $uploadFolder . DS . $fileName;

    // Make the dir if does not exist
    if(!file_exists($uploadFolder)){ mkdir($uploadFolder); }

    // Finally move from tmp to final location
    if (move_uploaded_file($uploadData['tmp_name'], $uploadPath))
    {
        $this->set('logo', $fileName);
        return true;
    }

    // Return false by default, should return true on success
    return false;
}

您可能必须自己显示错误验证消息,您可以使用以下方式执行此操作:

<!-- The classes are for twitter bootstrap 3 - replace with your own -->
<?= $form->error('pdf_file', null, array('class' => 'text-danger help-block'));?>

答案 1 :(得分:0)

如果您尝试在Cake中调试某事,请始终使用debug(sth) // sth could be variable could be string could be anything, cuz in Cake debug means

echo "<pre>";
print_r(sth);
echo "</pre>";`

它已经格式化得很好。
然后在那之后你必须把 die()放在echo之后,它会加载视图,这就是为什么即使有输出你也看不到它。