在cakePHP上传文件

时间:2013-05-31 14:58:08

标签: cakephp

您好我想使用cake php上传文件,我收到了文件,我正在使用   move_uploaded_file()移动到一个特定的位置,但它没有移动我的简单逻辑是   如下所示

if (move_uploaded_file($this->data['Add']['upload']['tmp_name'], APP . 'views' . DS . 

    'static' . DS.'uploads'.DS.'Rajaram'.DS )) {
                LogUtil::$logger->debug('KMP File upload Url : 
    '.var_export($this->data, true));
            }

先谢谢。

2 个答案:

答案 0 :(得分:1)

文件上传是CakePHP没有开箱即用的东西,这是使框架烦恼的唯一因素之一。

我通过使用回调方法向模型添加文件处理来解决这个问题。我使用beforeSave()上传实际文件,并使用beforeDelete()从文件系统中删除该文件。示例模型如下所示:

<?php
App::uses('File', 'Utility');

class Image extends AppModel {

    public $name = 'Image';

    public function beforeSave($options = array()) {
        $fieldName = 'filename';
        $field = $this->data[$this->alias][$fieldName];
        if (!is_array($field)) {
            $this->validationErrors[$fieldName][] = 'No file detected';
            return false;
        }
        switch ($field['error']) {
            case UPLOAD_ERR_OK:
                $newFilename = time() . '.jpg';
                $uploadDir = WWW_ROOT . 'files/';
                $source = $field['tmp_name'];
                $destination = $uploadDir . $newFilename;
                if (move_uploaded_file($source, $destination)) {
                    $this->data[$this->alias][$fieldName] = $newFilename;
                    return true;
                }
                else {
                    $this->validationErrors[$fieldName][] = 'No file detected';
                    return false;
                }
            break;
            default:
                $this->validationErrors[$fieldName][] = 'No file detected';
                return false;
            break;
        }
    }

    public function beforeDelete($cascade = true) {
        $image = $this->findById($this->id);
        $file = new File(WWW_ROOT . 'files/' . $image['Image']['filename']);
        return $file->delete();
    }
}

显然这不是一个完美的实现,所以请随意接受它,从中学习,适应它。

这是最近一个项目的袖口,其中只有一个模型附加了图像,但在一个更大的项目中,我很可能把它包装成一个很好的模型行为。

答案 1 :(得分:0)

在您的模型中,您可以使用afterSave回调方法来处理文件上传: -

public function afterSave($created) {

    if (isset($_FILES['data']['name'][$this->alias]['filename'])) {

        $filename = $_FILES['data']['name'][$this->alias]['filename'];

        $fileInfo = pathinfo($filename);
        $fileExt  = isset($fileInfo['extension']) ? $fileInfo['extension'] : '';
        $filename = $fileInfo['filename'];

        $newFilename = "$filename.$fileExt";

        $dir = WWW_ROOT . 'files' . DS . 'uploads';

        $target = $dir . DS . $newFilename;

        move_uploaded_file($source, $target);

    }

}

如果需要,您可以使用$ newFilename将文件名更改为适当的名称(我倾向于检查是否已存在同名文件,并重命名新文件以避免覆盖它。