Tengo el siguiente problema he logrado de forma perfecta subir archivos.
en mi base de datos yo tengo que subir los curriculums de la gente.
en formato doc, pdf y odt
los formatos la subida todo perfecto cuando le doy almacenar la base de datos
tiene un campo llamado cv que guarda el nombre del archivo en su registro
mi problema consiste en que cuando subo 2 archivos con el mismo nombre y extension
se sobre-escriben
tengo el siguiente codigo
<?php
class RegistroController extends Controller
{
public function actionIndex()
{
$model = new Usuarios;
$form = new CForm('application.views.forms.registro.registroForm',$model);
if($form->submitted('registrar') && $form->validate())
{
$model->attributes = $form->elements;
$model->cv=CUploadedFile::getInstance($model,'cv');
$model->cv->name = time().$model->cv->name;
if ($model->save())
{
echo $model->cv;
$model->cv->saveAs('cv/'.$model->cv);
}
/*$this->redirect(array('site/index'));*/
}
else
$this->render('index',array('registro'=>$form));
}
}
?>
noten y perdonen que el temita tiene algunas trazas que le hice de pruebas
el caso es que quiero lograr usar TIME() para ponele nombres a los archivos
y que no se repitan.
y cuando lo intento me dice el siguiente error
CException
Description
Property "CUploadedFile.name" is read only.
evidentemente fui a las API y veo que es read only ese argumento ahora me pregunto
como puedo cambiarlo? para que en la bd se guarde con el nombre parecido a
123123123cv.doc
por ejemplo
y que el archivo fisicamente se almacene igual que en la Db para luego yo ir a buscarlo???
porfavor si me lo ayudan a resolver les estaré agradecidos.
Aquí te dejo una función de mi aplicación en la que hago algo parecido :
public function actionUpdate()
{
$model=$this->loadusuario();
if($model->id != Yii::app()->user->id && Yii::app()->user->getState("tipo")!=0)
throw new CHttpException(500,'Se ha producido un error.');
if(isset($_POST['usuario']))
{
$model->attributes=$_POST['usuario'];
$model->avatar = strtolower($model->avatar);
$logo = CUploadedFile::getInstance($model,'avatar');
if($logo){
$ext = substr($logo->name, strpos($logo->name,"."),strlen($logo->name));
$model->avatar= "avatar_".$model->id.strtolower($ext);
if($model->save())
{
$logo->saveAs('images/uploads/'.$model->avatar);
$image = Yii::app()->image->load('images/uploads/'.$model->avatar);
$image->resize(50, 50, Image::WIDTH)->quality(75);
$image->save();
$this->redirect(Yii::app()->urlManager->createUrl('/usuario/show',array('id'=>$model->id)));
}
}
else{
if($model->save())
$this->redirect(Yii::app()->urlManager->createUrl('/usuario/show',array('id'=>$articulo->id)));
}
}
$this->render('update',array('model'=>$model));
}
No se si es la mejor manera, lo que yo hago es guardar la ruta en $model->avatar creando el nombre que quiero.
Ya intentaste hacer algo mas sencillo como lo siguiente, digo solo para hacer la prueba…
$archivo = CUploadedFile::getInstance($model,'cv');
$model->cv->name = $archivo->name."_".time();
Hey!
I’ve extended CFileHelper and added some little methods to handle this, like
<?php
class MyFileHelper extends CFileHelper{
public static function deleteFile($path){
return unlink($path);
}
public static function extractZipFile($zipFile,$pathToSave){
$zip = new ZipArchive();
if ($zip) {
if (($zip->open($zipFile)) && ($zip->extractTo($pathToSave))){
$zip->close();
return true;
}
}
return false;
}
public static function createDir($path, $recursive){
if (!is_dir($path)) {
return @mkdir($path, 0755, $recursive);
}
return false;
}
public static function renameFile($oldName, $newName){
if (file_exists($oldName))
return rename($oldName,$newName);
return false;
}
public static function deleteDir($dirName){
if (is_dir($dirName))
$dir_handle = opendir($dirName);
if (!$dir_handle)
return false;
while($file = readdir($dir_handle)) {
if ($file != "." && $file != "..") {
if (!is_dir($dirName."/".$file))
unlink($dirName."/".$file);
else
self::deleteDir($dirName.'/'.$file);
}
}
closedir($dir_handle);
rmdir($dirName);
return true;
}
}
?>
Put this in a file under protected/components and use like:
MyFileHelper::renameFile($oldName, $newName);
Hope it helps!
