您好我想使用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));
}
先谢谢。
答案 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将文件名更改为适当的名称(我倾向于检查是否已存在同名文件,并重命名新文件以避免覆盖它。