2012-06-03 8 views
6

का उपयोग कर फ़ाइल अपलोड करने का उचित तरीका क्या है I फ़ाइल अपलोड करने के लिए ट्यूटोरियल 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

फिर वाईआईआई के एपीआई दस्तावेज की जांच करें जो यह प्रदान करता है। आपने उसे किया है? – hakre

उत्तर

0

I alwais 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

मैं Yii

में सरल फ़ाइल अपलोड करने के लिए एक व्यवहार लिखा है आप github

-1

पर गाइड और डाउनलोड फ़ाइल देख सकते हैं मैं एक फ़ाइल अपलोड करें और डेटाबेस में पथ बचाने के लिए इन कोड लिखने है बाइंड पैरामीटर का उपयोग

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

} 

मुझे आशा है कि ये आपके लिए उपयोगी है।