简体   繁体   中英

CakePHP validation for file upload

I'm trying to perform validation with cake 2.3.8 on a file upload to make sure that only PDF's can be uploaded. I'm loosly basing this off of this tutorial.

My form is displaying the asterisk next to the input, and when I remove the validation from my model the asterisk goes away. I'm assuming this means it "sees" the input for validation, but I just can't figure out why even the custom validation isn't being triggered.

Here's the form

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));

Here's the code in my Upload model

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'
          )
    )
);

Here is my answer (albeit for cakephp 1.3 ):

In your model add the following validation to your $validate variable.

$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;
}

You may have to display the error validation messages yourself, you can do this using:

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

if you try to debug sth in Cake, always use debug(sth) // sth could be variable could be string could be anything, cuz in Cake debug means

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

it's already formatted very well.
then after that you have to put die() otherwise after echo sth it will load the view that's why you can't see it even there was an output.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM