我需要通过ajax请求将图像发送到服务器,它完成得很好
在我的控制器中,我可以使用$_FILES["image"]
来做它的东西
但是我需要在保存之前验证图像
在Yii中,这可以通过做这样的事来实现
$file = CUploadedFile::getInstance($model,'image');
if($model->validated(array('image'))){
$model->image->saveAs(Yii::getPathOfAlias('webroot') . '/upload/user_thumb/' . $model->username.'.'.$model->photo->extensionName);
}
但问题是我没有$model
,我所拥有的只是$_FILES["image"]
,现在应该放什么而不是$model
???
有没有其他方法可以验证和保存文件而无需创建模型,只需使用$_FILES["image"]
?
感谢这个令人敬畏的社区...... :)
答案 0 :(得分:1)
您可以通过多种方式进行上传。我想向你提供其中一个。
1.您需要为图像创建模型。
class Image extends CActiveRecord {
//method where need to specify validation rules
public function rules()
{
return [
['filename', 'length', 'max' => 40],
//other rules
];
}
//this function allow to upload file
public function doUpload($insName)
{
$file = CUploadedFile::getInstanceByName($insName);
if ($file) {
$file->saveAs(Yii::getPathOfAlias('webroot').'/upload/user_thumb/'.$this->filename.$file->getExtensionName());
} else {
$this->addError('Please, select at least one file'); // for example
}
}
}
2.现在,需要创建控制器,您将在其中执行所有操作。
class ImageController extends CController {
public function actionUpload()
{
$model = new Image();
if (Yii::app()->request->getPost('upload')) {
$model->filename = 'set filename';
$insName = 'image'; //if you try to upload from $_FILES['image']
if ($model->validate() && $model->doUpload($insName)) {
//upload is successful
} else {
//do something with errors
$errors = $model->getErrors();
}
}
}
}
答案 1 :(得分:1)
在某些情况下,创建模型可能有点过分。
$ _FILE超变量是HTTP机制的一部分。
您可以使用本机PHP函数move_uploaded_file()
来处理副本 $fileName = "/uploads/".myimage.jpg";
unlink($fileName);
move_uploaded_file($_FILES['Filedata']['tmp_name'], $fileName);
但是,您失去了使用提供附加功能和检查的库(例如文件类型和文件大小限制)的细节。