2012-10-12 105 views
0

我想上傳多個圖像。我使用Codeigniter,我知道有一個內置的文件上傳類,但我只是試驗我自定義的圖像上傳庫。我已經提供了下面的代碼。試圖上傳多個圖像,但它只上傳一個

我面對的問題是下面的代碼是隻上傳一個(最後選擇的形式)圖像。

請問您能否告訴我我在做什麼錯?

我的控制器:

function img_upload(){ 

    $this->load->library('image_upload');   

    $image1= $this->image_upload->upload_image('imagefile1'); 
    $image2= $this->image_upload->upload_image('imagefile2'); 
    $image3= $this->image_upload->upload_image('imagefile3'); 

    echo $image1 ."<br>"; echo $image2; 
} 

應用程序/庫/ image_upload.php(訂作庫)

function upload_image($image_info){ 

    $image=$_FILES[$image_info]['name']; 
    $filename = stripslashes($image); 
    $extension = $this->getExtension($filename); 
    $extension = strtolower($extension); 

    $image_name=time().'.'.$extension; 

    $newname="support/images/products/".$image_name; 
    $uploaded = move_uploaded_file($_FILES[$image_info]['tmp_name'], $newname); 

    if($uploaded) {return $image_name; } else {return FALSE;} 
} 

我的形式

<form id="myForm" enctype="multipart/form-data" 
action="<?php echo base_url();?>add/img_upload" method="post" name="myForm"> 

    <input type="file" name="imagefile1" size="20" /><br> 
    <input type="file" name="imagefile2" size="20" /><br> 
    <input type="file" name="imagefile3" size="20" /><br> 
    <br /><br /> 
    <input type="submit" value="upload" />  
</form> 
+0

您是否嘗試打印生成的文件名,以查看它是否每次都覆蓋圖像? –

+1

是的,我試過了,它顯示兩次相同的文件名。謝謝 –

+0

小文件呢?我曾經有過類似的問題,因爲我上傳的文件在哪裏大到最大限度。 – bottleboot

回答

0

您可以創建某種回滾功能並使用CI本地庫。它對於服務器來說只是一些額外的工作,但它不太容易/乾淨/容易調試代碼,並且工作起來。

function do_upload() 
{ 

1 - 構

$config['upload_path'] = './uploads/'; 
    // other configurations 

    $this->load->library('upload', $config); 
    $error = array('stat'=>0 , 'reason'=>'' ; 

2-上傳

 if (! $this->upload->do_upload('file_1')) 
     { 
      $error['stat'] = 1 ; 
      $error['reason'] = $this->upload->display_errors() ; 

     } 
     else 
     { $uploaded_array[] = $uploaded_file_name ; } 

      // you may need to clean and re initialize library before new upload 
     if (! $this->upload->do_upload('file_2')) 
     { 
      $error['stat'] = 1 ; 
      $error['reason'] = $this->upload->display_errors() ; 

     } 
     else 
     { $uploaded_array[] = $uploaded_file_name ; } 

3 - 在最後檢查錯誤和回滾

if($error['stat'] == 1) 
{ 
    $upload_path = './upload/'; 
    if(!empty($uploaded_array)) 
    { 
     foreach($uploaded_array as $uploaded) 
     { 
      $file = $upload_path.$uploaded; 
      if(is_file($file)) 
      unlink($file); 
     } 
    } 
    echo 'there was a problem : '.$error['reason']; 
} 
else 
{ 
    echo 'success'; 
} 




} 
+0

感謝您的回覆。我沒有使用Codeigniter的天真庫,因爲在上傳任何圖像之前,我無法檢查上傳的所有圖像是否有效(我的意思是大小和格式)。我的意思是,如果我的任何圖像存在驗證問題,那麼我當然不想上傳任何圖像。但在codeigniter中,如果任何圖像有任何驗證錯誤,沒有該特定圖像,則會上傳其他圖像,這是我不想要的。 –

+0

而另一個問題是,我的表單中的圖片上傳功能是可選的,所以如果我選擇兩個圖片而不是三個codeigniters顯示和錯誤,說我沒有選擇要上傳的文件,但在後臺它已經上傳了這兩個文件。 –

+0

從我看到您檢查圖庫中的圖像,並檢查並分別上傳每個圖像。這意味着即使某個圖像出現問題,仍會上傳其他圖片。 – max

0

我已經找到了解決我的問題,並認爲它可以幫助我的人我分享。

的問題是在image_upload.php文件(定製庫),特別是在這一行:

$image_name=time().'.'.$extension; // 

時間()也許在覆蓋這些文件。所以我用以下替換我以前的代碼:

function upload_image($image_info){ 

    $image=$_FILES[$image_info]['name']; 
    $filename = stripslashes($image); 
    $extension = $this->getExtension($filename); 
    $extension = strtolower($extension); 

    $image_name=$this->get_random_number().'.'.$extension; 

    $newname="support/images/products/".$image_name; 
    $uploaded = move_uploaded_file($_FILES[$image_info]['tmp_name'], $newname); 

    if($uploaded) {return $image_name; } else {return FALSE;} 
} 


    function get_random_number(){ 

    $today = date('YmdHi'); 
    $startDate = date('YmdHi', strtotime('-10 days')); 
    $range = $today - $startDate; 
    $rand1 = rand(0, $range); 
    $rand2 = rand(0, 600000); 
    return $value=($rand1+$rand2); 
} 
+1

你知道PHP已經有本地的uniqid()函數來生成使用時間和日期的唯一字符串。 – max

+0

:)我完全忘了它。謝謝:) –

+0

到目前爲止,我已經開發了另一個功能來檢查上傳圖像之前的驗證錯誤。如果任何上傳的圖像出現錯誤,則不會上傳其餘的圖像。它現在工作完美:)謝謝你的時間。 –