2012-06-03 5 views
6

Я следую учебнику http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/ для загрузки файла. Я написал следующий код:Что такое правильный способ загрузки файла с помощью CUploadedFile

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

Но проблема в том, что, если существует файл с таким же именем в той же директории, файлы ни перезаписаны или сохранить с другим именем. Что я хочу, это новое изображение say image.jpg, если файл с тем же именем существует, для его переименования: image_1.jpg

Возможно ли это? Ответьте, пожалуйста.

+1

Просто добавьте номер в случае необходимости. Так просто. Идите вперед, вы можете это сделать! – hakre

+0

@hakre Я имел в виду, что мне нужно добавить нумерацию, только если файл с тем же именем существует в этом каталоге. Я просто спрашиваю, есть ли встроенная функция для обработки этого. В противном случае мне нужно будет выполнить проверку file_exists() и прокрутить имена файлов с номерами до тех пор, пока не будет достигнуто допустимое имя файла. Если Yii может справиться с этим, тогда было бы хорошо. – ajaybc

+1

Затем проверьте документацию API YII, что он предлагает. Вы это сделали? – hakre

ответ

0

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

Функция разрыва для получения имени добавочного номера не является хорошей идеей, может вызвать ошибку, если в файле указано несколько точек, доступных в имени файла – Krishna

+0

Любое предложение сделать этот код лучше? – sensorario

+1

pathinfo() используется для получения всей информации о файле .. – Krishna

1

я написал поведение для простого при загрузке файла в YII

вы можете увидеть руководство и скачать файл на github

-1

Я пишу этот код для загрузки файла и пути для сохранения в базе данных с использованием параметров связывания

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

} 

Надеюсь, они будут полезны для вас.

Смежные вопросы