使用CUploadedFile上传文件的正确方法是什么

时间:2012-06-03 13:27:08

标签: php yii

我正在关注教程http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/上传文件。我写了以下代码:

$menuitem->attributes = $_POST['MenuItems'];
$menuitem->clientId = Yii::app()->user->clientId;
$menuitem->image = CUploadedFile::getInstance($menuitem, 'image');
if($menuitem->save()){
   $menuitem->image->saveAs(
       Yii::app()->getBasePath()."/../../".$menuitem->image->getName()
   );
}

但问题是,如果同一目录中存在同名文件,则不会覆盖这些文件或使用其他名称保存这些文件。 我想要的是新图像说image.jpg,如果存在同名文件,则重命名为:image_1.jpg

有可能吗?请回复。

3 个答案:

答案 0 :(得分:1)

我在yii中为简单的上传文件写了一个行为

您可以在github

上查看指南和下载文件

答案 1 :(得分:0)

我alwais用md5()函数重写原始名称。试试这个代码。所有图像都有一个唯一的名称。这将保存您的模型,然后生成唯一的名称。并再次保存模型。不是很干净但有效!

$menuitem->attributes = $_POST['MenuItems'];
$menuitem->clientId = Yii::app()->user->clientId;
if ($menuitem->save()) {
    $imageName = @$_FILES["MenuItems"]["name"]["image"];
    $uniqueName = (md5($imageName . mktime() . $menuitem->id)) . '.' . (end(explode('.', $imageName)));
    $original = Yii::app()->getBasePath() . "/../../" . $uniqueName;
    $menuitem->image = CUploadedFile::getInstance($menuitem, 'immagine');
    $menuitem->image->saveAs($original);
    $menuitem->image = $uniqueName;
    $menuitem->save();
}

答案 2 :(得分:0)

我已经编写了这些代码来上传文件并使用绑定参数

在数据库中保存路径
$model->attributes=$_POST['Form'];
$uploadedFile=CUploadedFile::getInstance($model,'resume');
$path = '/protected/upload/'.time().$uploadedFile;
if($model->validate()){
    $connection=Yii::app()->db;
    $filePath=Yii::app()->basePath .DIRECTORY_SEPARATOR.'..'.$path; // file upload location

    $result = $uploadedFile->saveAs($filePath); //upload file

// an SQL with placeholders 
$hobbies=implode(",",$model->hobbies); // comma deliminated string of hobbies
$dob =date('Y-m-d',strtotime($model->dob)); // convert date 
$status=1; // status of record
$sql='INSERT INTO student (name, dob, email, gender, hobbies, city, resume, message,status, created_date,modified_date) VALUES(:name,:dob,:email,:gender,:hobbies,:city,:resume,:msg,:status,now(),now())'; 

$command=$connection->createCommand($sql);

// replace the placeholder with the actual username value
$command->bindParam(":name",$model->name,PDO::PARAM_STR);
$command->bindParam(":dob",$dob,PDO::PARAM_STR);
$command->bindParam(":email",$model->email,PDO::PARAM_STR);
$command->bindParam(":gender",$model->gender,PDO::PARAM_INT);
$command->bindParam(":hobbies",$hobbies,PDO::PARAM_STR);
$command->bindParam(":city",$model->city,PDO::PARAM_INT);
$command->bindParam(":resume",$path,PDO::PARAM_STR);
$command->bindParam(":msg",$model->msg,PDO::PARAM_STR);
$command->bindParam(":status",$status,PDO::PARAM_INT);
$result=$command->execute(); 

}

我希望这对你有用。