2011-11-04 91 views
0

我已經寫了一個函數,它可以從窗體上傳圖片,在服務器上創建文件並將信息添加到數據庫中,但是我有一個噩夢試圖讓它做我想要的東西。上傳照片問題

編輯

目前,它會顯示正確的錯誤消息,如果文件類型是錯誤的,超過3MB,但是當我嘗試上載17MB .bmp文件它取消並記錄我出去。它似乎重新啓動我的process.php文件後,它已經處理了預期的功能。

我很困惑,所以任何幫助,將不勝感激。由於

<form action="process.php" method="POST" enctype="multipart/form-data" name="formUpload"> 
     <label>Picture:</label> 
     <input type="file" name="photo" id="photobrowser" tabindex="4"> 
     <span class="error"><?php echo $form->error("photo"); ?></span><br /> 
     <input type="hidden" name="sessionid" value="<?php echo $sessionid; ?>" /> 
     <input type="hidden" name="subphoto" value="1" /> 
     <input type="image" src="styling/images/button-add-photo.png" id="subBtn" tabindex="6" /> 
    </form> 

process.php

class Process { 

function Process(){ /* Class constructor */ 
    global $session; 

    if(isset($_POST['subphoto'])){ /* User submitted an advert photo */ 
     $this->procAddPhoto(); 
    } else if($session->logged_in){ /* No form was submitted therefor logout */ 
     $this->procLogout(); 
    } else { /* User trying to view this file */ 
     header("Location: /"); 
    } 
} 
function procAddPhoto(){ 
    global $session, $form; 

    $retval = $session->addPhoto($_FILES['photo']['size'], $_FILES['photo']['type'], $_FILES['photo']['tmp_name'], $_POST['sessionid']);  

    if($retval == 0){ /* Successful */ 
     // do stuff 
    } else if($retval == 1){ /* Errors found */ 
     // do stuff 
    } else if($retval == 2){ /* Adding failed */ 
     // do stuff 
    } 
    } // close function procAddPhoto() 
}; 

$process = new Process; /* Initialize process */ 

?> 

session.php文件

function addPhoto($subphotoSize,$subphotoType,$subphotoTmpname,$subsessionid){ 
    global $database, $form; 

    $maxFileSize = 3000000; // bytes (3 MB) 

    /* Image error checking */ 
    $field = "photo"; 
    if($subphotoSize == 0){ 
     $form->setError($field, "* No file selected"); 
    } else { 
     list($width, $height, $type, $attr) = getimagesize($subphotoTmpname); 
     if($width > 4000){ 
      $form->setError($field, "* Max photo width is 4000 pixels."); 
     } else if($subphotoSize > $maxFileSize) { 
      $form->setError($field, "* Photo is above the maximum of 3 MB"); 
     } else if(($subphotoType != "image/jpeg") && ($subphotoType != "image/pjpeg") && ($subphotoType != "image/png")){ 
      $form->setError($field, "* $subphotoType is wrong file type"); 
     } 
    } 
    /* Errors exist, have user correct them */ 
    if($form->num_errors > 0){ 
     return 1; //Errors with form 
    } else { // Else use variables 

     /* Get random string for new filename name */ 
     $randNum = $this->generateRandStr(10); 
     $filerootpath = PHOTOS_DIR.$subsessionid."/"; 
     $thumbrootpath = PHOTOS_DIR.$subsessionid."/thumbs/"; 

     if($subphotoType == "image/png"){ 
      $filename = $randNum.".png"; 
     } else if ($subphotoType == "image/jpeg" || $subphotoType == "image/pjpeg"){ 
      $filename = $randNum.".jpg"; 
     } 
     $fullURL = $filerootpath.$filename; 
     $thumbURL = $thumbrootpath.$filename; 

     /* Make sure file is RGB colors */ 
     $getimagesize = getimagesize($subphotoTmpname); 
     if (isset($getimagesize['channels']) && $getimagesize['channels'] == 4 && $getimagesize[2] == IMAGETYPE_JPEG) { 
      $im = @imagecreatefromjpeg($subphotoTmpname); 
      if ($im) { 
       imagejpeg($im, $image, 75); 
       imagedestroy($im); 
      } 
     } 


     /* Upload files to correct folders */ 
     move_uploaded_file($subphotoTmpname, "$fullURL"); 

     /* Use session ID for the advert ID because it hasnt been made yet */ 
     $userSession = $this->userinfo['userid']; 
     $ownerID = $this->userinfo['id']; 
     if(!$database->addNewPhoto($ownerID,$fullURL,$userSession,$is_main_photo, $subsessionid, $thumbURL)){ 
      return 2; // Failed to add to database 
     } 
    } 
    return 0; // Success 
} 
+0

「除非,該文件的大小是幾MB,在這種情況下,它會將用戶完全註銷」你的用戶會因此而愛你...... – Brad

+0

感謝那個大聲笑。 – user29660

回答

0

只是一個想法......我猜,你有一個以上的問題在這裏。你說過,當有人試圖通過XMB上傳文件時,它基本上會擊中kill開關。你知道嗎,粗略地說,這個大小是什麼?如果你這樣做,你可以將它與你的PHP安裝的upload_max_filesize和post_max_size設置進行比較嗎?它們都應該在phpinfo()中可見。我認爲默認值在2mb左右,但我可能是錯的。無論哪種方式,我知道當你嘗試上傳超出這些設置時,它基本吐出了一點。您可能需要更改該設置的php.ini設置。

+0

我在php.ini文件中更改了這些值,並且腳本仍然保持不變。如果你不介意再看一次,我編輯了原文。謝謝 – user29660

+0

需要牢記兩件事。首先,你在php.ini中改變了那些值?這是沒有很好的文件,我可能應該在我原來的回答中提到這一點,但我有點匆忙,但post_max_size必須至少是upload_max_filesize的兩倍大小或設置將被拒絕,並分別默認8MB和2MB將用過的。我會驗證你的設置是否正確,然後重新啓動php(如果你沒有重新啓動php引擎,這些更改不會生效),並看看phpinfo(),以確保它完成。另外... –

+0

我真的不確定我是否理解不能看到某些文件的問題。你是否說文件能正確上傳,但不能在瀏覽器中看到?或者您是否在瀏覽器中收到錯誤消息?如果您可以明確地確定何時/何地發生特定錯誤,這將有所幫助。即使只提供一個鏈接到引發這個錯誤的圖像之一也會有所幫助。 –

0

它顯示一個錯誤,如果文件類型心不是正確的,除非,這個文件 的大小几MB,在這種情況下,它完全註銷用戶, 幾乎就像其殺死所有的會話變量

請打開/etc/php5/apache2/php.ini(假設您使用的是apache2)並設置upload_max_filesize = 5M(對於5兆字節的文件),並且您有file_uploads = On。然後重新啓動Apache。然後再試一次。

,因爲它contatins錯誤不能顯示的圖像。」但是,當我 從服務器下載上傳的圖片,圖片顯示 罰款,但不通過HTTP。

可您檢查(並確保您正在訪問正確的目錄;請嘗試在瀏覽器地址欄中複製圖像的相對路徑)

讓我先清楚幾件事:

1.您可以上傳17 MB文件,但您想要限制上傳超過3 MB。 2.it上傳17 MB文件,但從瀏覽器中可以看到。但是如果你從服務器上下載窗口,可以正確打開它。

你可以插入:var_dump($ ubphotoSize);的var_dump($$ maxFileSize爲);在addPhot()的開頭,然後再試一次。根據你看來它不能比較文件大小。請讓我們知道我們的輸出。

+0

它不顯示在phpinfo文件上,我認爲主機限制了這一點。因此,我現在正在通過電子郵件發送它們以瞭解其價值。謝謝 – user29660

+0

我在我自己的電腦上使用EasyPHP,並且我製作了upload_max_filesize = 18M,但仍然將我註銷。我上傳一個17Mb .bmp文件,所以它應該說它太大或它的錯誤文件類型,但它沒有顯示正確的錯誤與4 Mb jpg或.bmp文件(不允許)。 – user29660