2012-06-03 12 views
6

Podążam za tutorialem http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/, aby przesłać plik. Napisałem następujący kod:Jaki jest właściwy sposób przesyłania pliku przy użyciu 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() 
    ); 
} 

Ale problemem jest to, że jeśli plik o tej samej nazwie w tym samym katalogu, pliki nie jest ani nadpisane lub zapisany pod inną nazwą. To, czego chcę, to nowy obraz, powiedz image.jpg, jeśli istnieje plik o tej samej nazwie, którego nazwa ma zostać zmieniona na: image_1.jpg

Czy to możliwe? Proszę odpowiedz.

+1

Po prostu dodaj numer w razie potrzeby. Tak proste. Śmiało, możesz to zrobić! – hakre

+0

@hakre Chodzi mi o to, że muszę dodać numerację tylko wtedy, gdy plik o tej samej nazwie istnieje w tym katalogu. Pytam tylko, czy jest jakaś wbudowana funkcja do obsługi tego. W przeciwnym razie musiałbym wykonać sprawdzenie file_exists() i zapętlić nazwy plików z liczbami, dopóki nie zostanie osiągnięta poprawna nazwa pliku. Jeśli Yii też sobie z tym poradzi, byłoby miło. – ajaybc

+1

Następnie sprawdź dokumentację API co do tego, co oferuje. Zrobiłeś to? – hakre

Odpowiedz

0

I alwais przepisać oryginalną nazwę z funkcją md5(). Wypróbuj ten kod. Wszystkie obrazy będą miały unikalną nazwę. Spowoduje to zapisanie modelu, a następnie wygenerowanie unikatowej nazwy. I zapisz ponownie model. Nie jest bardzo czysty, ale działa!

$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

Funkcja rozbicia w celu uzyskania nazwy rozszerzenia nie jest dobrym pomysłem, może spowodować błąd, jeśli w nazwie pliku znajduje się wiele kropek. – Krishna

+0

Jakieś sugestie, aby ulepszyć ten kod? – sensorario

+1

pathinfo() służy do uzyskania wszystkich informacji dotyczących pliku .. – Krishna

1

ja napisałem zachowanie dla prostego przesyłanego pliku w yii

widać instrukcji i pobierz plik na github

-1

mam napisać te kod załadować plik i zapisać ścieżkę w bazie używając parametrów wiązania

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

} 

Mam nadzieję, że przydadzą ci się.

Powiązane problemy