2012-06-03 19 views
6

Tôi đang làm theo hướng dẫn http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/ để tải lên tệp. Tôi đã viết mã sau đây:Cách thích hợp để tải lên tệp bằng 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() 
    ); 
} 

Nhưng vấn đề là nếu một tệp có cùng tên tồn tại trên cùng một thư mục, các tệp đó sẽ không bị ghi đè hoặc lưu với tên khác. Điều tôi muốn là hình ảnh mới nói image.jpg, nếu một tệp có cùng tên tồn tại, được đổi tên thành: image_1.jpg

Có thể không? Xin hãy trả lời.

+1

Chỉ cần thêm số trong trường hợp bạn cần. Thật đơn giản. Đi trước, bạn có thể làm cho nó xảy ra! – hakre

+0

@hakre Tôi có nghĩa là tôi cần phải thêm số chỉ khi tệp có cùng tên tồn tại trong thư mục đó. Tôi chỉ yêu cầu nếu có bất kỳ chức năng được xây dựng trong để xử lý đó. Nếu không, tôi sẽ phải làm một file_exists() kiểm tra và lặp qua tên tập tin với các số cho đến khi một tên tập tin hợp lệ đạt được. Nếu Yii có thể xử lý điều đó thì nó sẽ rất tuyệt. – ajaybc

+1

Sau đó kiểm tra tài liệu API của YII những gì nó cung cấp. Bạn đã hoàn thành chưa? – hakre

Trả lời

0

Tôi alwais viết lại tên gốc bằng hàm md5(). Hãy thử mã này. Tất cả các hình ảnh sẽ có một tên duy nhất. Điều này sẽ lưu mô hình của bạn, và sau đó tạo ra một tên duy nhất. Và lưu lại mô hình. Không phải là rất sạch sẽ nhưng hoạt động!

$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

chức năng phát nổ để nhận tên tiện ích không phải là ý tưởng hay, có thể gây ra lỗi nếu có nhiều dấu chấm có sẵn trong tên tệp – Krishna

+0

Bất kỳ đề xuất nào để làm cho mã này tốt hơn? – sensorario

+1

pathinfo() được sử dụng để lấy tất cả thông tin liên quan đến tập tin .. – Krishna

1

tôi đã viết một hành vi cho tập tin tải lên đơn giản trong yii

bạn có thể xem hướng dẫn và tải file trên github

-1

Tôi đã viết những mã để tải lên một tập tin và lưu đường dẫn trong cơ sở dữ liệu sử dụng thông số liên kết

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

} 

Tôi hy vọng các thông số này hữu ích cho bạn.

Các vấn đề liên quan