2012-06-03 3 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() 
    ); 
} 

그러나 문제는 같은 이름의 파일이 같은 디렉토리에 존재하는 경우, 파일이 덮어 쓰거나 다른 이름으로 저장도 있다는 것이다. 새 이미지는 image.jpg가 같은 이름의 파일 인 경우 다음과 같이 바뀝니다. image_1.jpg

가능합니까? 회신 해주십시오.

+1

필요에 따라 번호를 추가하십시오. 간단합니다. 어서, 당신은 그것을 만들 수 있습니다! – hakre

+0

@hakre 나는 동일한 이름의 파일이 해당 디렉토리에 존재하는 경우에만 번호 매기기를 추가해야한다는 의미입니다. 나는 그것을 처리 할 수있는 함수가 내장되어 있는지 묻는 것입니다. 그렇지 않으면 유효한 파일 이름에 도달 할 때까지 file_exists() 검사를 수행하고 파일 이름에 번호를 반복해야합니다. Yii가 그것을 처리 할 수 ​​있다면 너무 좋았을 것입니다. – ajaybc

+1

그런 다음 YII API 문서를 확인하십시오. 그거 했니? – hakre

답변

0

나는 원래 이름을 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

는 난 당신이 내가 파일을 업로드 및 데이터베이스 경로를 저장하려면 다음 코드를 작성했습니다 github

-1

에 가이드 및 다운로드 파일을 볼 수 있습니다 YII

간단한 업로드 파일의 동작을 썼다 바인드 매개 변수 사용

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

} 

이 정보가 유용 할 것입니다.

관련 문제