2012-06-03 13 views
6

hochladen Ich verfolge das Tutorial http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/ zum Hochladen einer Datei. Ich habe den folgenden Code geschrieben:Was ist der richtige Weg, um eine Datei mit 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() 
    ); 
} 

Aber das Problem ist, dass, wenn eine Datei mit dem gleichen Namen auf dem gleichen Verzeichnis vorhanden ist, werden die Dateien weder überschrieben oder mit einem anderen Namen gespeichert. Was ich will, ist das neue Bild say image.jpg, wenn eine Datei mit dem gleichen Namen existiert, umbenannt zu: image_1.jpg

Ist es möglich? Bitte antworte.

+1

Fügen Sie einfach die Nummer hinzu, falls Sie sie benötigen. So einfach. Mach weiter, du kannst es schaffen! – hakre

+0

@hakre Ich meinte, ich muss die Nummerierung nur hinzufügen, wenn die Datei mit dem gleichen Namen in diesem Verzeichnis existiert. Ich frage nur, ob es eine eingebaute Funktion gibt, um damit umzugehen. Sonst würde ich eine file_exists() Prüfung durchführen und Dateinamen mit Zahlen durchschleifen müssen, bis ein gültiger Dateiname erreicht wird. Wenn Yii das auch kann, wäre es nett gewesen. – ajaybc

+1

Dann überprüfen Sie die API-Dokumentation von YII, was es bietet. Hast du das gemacht? – hakre

Antwort

0

Ich schreibe immer den ursprünglichen Namen mit md5() -Funktion. Probieren Sie diesen Code aus. Alle Bilder haben einen eindeutigen Namen. Dadurch wird Ihr Modell gespeichert und anschließend ein eindeutiger Name generiert. Und speichern Sie das Modell erneut. Ist nicht sehr sauber aber funktioniert!

$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

explode-Funktion für den Erhalt der Erweiterung Name ist keine gute Idee, könnte zu einem Fehler führen, wenn mehrere Punkte im Dateinamen – Krishna

+0

Jeder Vorschlag, um diesen Code besser zu machen? – sensorario

+1

pathinfo() verwendet, um alle Informationen bezüglich der Datei zu erhalten. – Krishna

1

Ich habe geschrieben, ein Verhalten für einfache Hochladen der Datei in yii

können Sie Anleitung und Download-Datei auf github

-1

sehen habe ich diesen Code schreiben, um eine Datei hochladen und den Pfad in der Datenbank speichern mit Bindeparametern

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

} 

Ich hoffe, dass diese für Sie nützlich sind.

Verwandte Themen