0

嗨,我想使用 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));
            }

提前致谢。

4

2 回答 2

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

显然这不是一个完美的实现,所以请随意借鉴、学习、调整。

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

于 2013-05-31T15:07:28.387 回答
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 将文件名更改为适当的名称(我倾向于检查是否已经存在同名文件并重命名新文件以避免覆盖它。

于 2013-05-31T15:05:27.953 回答