2012-06-03 17 views
6

? Estoy siguiendo el tutorial http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/ para cargar un archivo. He escrito el siguiente código:¿Cuál es la forma correcta de cargar un archivo usando 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() 
    ); 
} 

Pero el problema es que si existe un archivo con el mismo nombre en el mismo directorio, los archivos no es ni sobrescritos o guardado con un nombre diferente. Lo que quiero es la nueva imagen, diga image.jpg, si existe un archivo con el mismo nombre, cambie el nombre a: image_1.jpg

¿Es posible? Por favor responde.

+1

Simplemente agregue el número en caso de que lo necesite. Así de simple. ¡Adelante, puedes hacerlo realidad! – hakre

+0

@hakre Quise decir que necesito agregar la numeración solo si el archivo con el mismo nombre existe en ese directorio. Solo estoy preguntando si hay alguna función incorporada para manejar eso. De lo contrario, tendría que hacer una comprobación file_exists() y recorrer los nombres de los archivos con números hasta que se llegue a un nombre de archivo válido. Si Yii puede manejar eso también, hubiera sido bueno. – ajaybc

+1

Luego verifique la documentación API de YII que ofrece. ¿Ha hecho usted eso? – hakre

Respuesta

0

Siempre reescribo el nombre original con la función md5(). Prueba este código Todas las imágenes tendrán un nombre único. Esto guardará su modelo y luego generará un nombre único. Y guarde nuevamente el modelo. No está muy limpio, pero funciona!

$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

explotar la función para obtener el nombre de la extensión no es una buena idea, podría causar un error si hay varios puntos disponibles en el nombre de archivo – Krishna

+0

¿Alguna sugerencia para mejorar este código? – sensorario

+1

pathinfo() utilizado para obtener toda la información relacionada con el archivo ... – Krishna

1

he escrito un comportamiento de carga de archivos simple en yü

se puede ver guía y descarga de archivos en github

-1

he escribir estos códigos para cargar un archivo y ruta para guardar la base de datos utilizando los parámetros de enlace

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

} 

Espero que estos sean útiles para usted.

Cuestiones relacionadas