PHP上傳文件時無法上傳成功,$_FILES['screenshot']['tmp_name']為空

最近在學習《HeadFirst PHP & MySQL》一書的第5章“使用存儲在文件中的數據”,做一個文件上傳的應用時,出現瞭錯誤,就是文件無法成功上傳。這個問題困擾瞭我很久,不過還好最後終於解決瞭。原因是我上傳的圖片文件大小超過瞭HTML 表單中 MAX_FILE_SIZE 選項指定的值32768Bytes即32KB導致無法上傳成功。

我使用瞭XAMPP(Apache + MySQL + PHP + Perl)集成開發包和Zend
Studio 10.6作為PHP IDE開發環境,另外關於PHP調試我采用瞭XDebug,在Zend Studio10.6中配置我參考瞭博文Zend Studio 10.5 與 XDebug 調試| Zend Debugger 說明 Drupal 源代碼 (一)

我的addscore.php的PHP代碼如下:



  
  Guitar Wars - Add Your High Score
  


  

Guitar Wars - Add Your High Score

<?php require_once 'appvars.php'; require_once 'connectvars.php'; if (isset($_POST['submit'])) { // Grab the score data from the POST $name = $_POST['name']; $score = $_POST['score']; $screenshot = $_FILES['screenshot']['name']; // echo "name: $name
"; // echo "score: $score
"; // echo "screenShot: $screenshot
"; if (!empty($name) && !empty($score) && !empty($screenshot)) { // Move the file to the target upload folder $target = GW_UPLOADPATH . $screenshot; echo json_encode($_FILES); if (move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)) { // Connect to the database $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Error Connecting to MySQL Database!'); // Write the data to the database $query = "INSERT INTO guitarwars VALUES (0, NOW(), '$name', '$score','$screenshot')"; mysqli_query($dbc, $query) or die('Error querying database;'); // Confirm success with the user echo '

Thanks for adding your new high score!

'; echo '

Name: ' . $name . '
'; echo 'Score: ' . $score; echo 'ScZ喎?/kf/ware/vc/vcmUgaW1hZ2U=" />

'; echo '

<< Back to high scores

'; // Clear the score data to clear the form $name = ""; $score = ""; $screenshot = ""; mysqli_close($dbc); } } else { echo '

Please enter all of the information to add your high score.

'; } } ?>
<form method="post" enctype="multipart/form-data" action=""> <input type="text" id="name" name="name" value="" />
<input type="text" id="score" name="score" value="" />

在使用Zend Sutdio10.6調試上面這段PHP代碼時我發現“if (move_uploaded_file($_FILES[‘screenshot’][‘tmp_name’], $target)) {”這行代碼裡面的代碼塊沒有執行,查看瞭超全局變量$_FILES[‘screenshot’][‘tmp_name’]的值為空,然後我在這行代碼前以JSON格式打印出$_FILES變量的值,如下:

{"screenshot":{"name":"Penguins.jpg","type":"","tmp_name":"","error":2,"size":0}}

截圖如下:

然後我查詢$_FILES[“screenshot’][‘error’]為2,上網查詢瞭一下,關於$_FILES超級全局變量大體如下:

PHP編程語言中的常見的$_FILES系統函數用法有:

$_FILES[‘myFile’][‘name’] 顯示客戶端文件的原名稱。

$_FILES[‘myFile’][‘type’] 文件的 MIME 類型,例如”image/gif”。

$_FILES[‘myFile’][‘size’] 已上傳文件的大小,單位為字節。

$_FILES[‘myFile’][‘tmp_name’] 儲存的臨時文件名,一般是系統默認。

$_FILES[‘myFile’][‘error’] 該文件上傳相關的錯誤代碼。以下為不同代碼代表的意思:

0; 文件上傳成功。

1; 超過瞭文件大小php.ini中即系統設定的大小。

2; 超過瞭文件大小

MAX_FILE_SIZE 選項指定的值。

3; 文件隻有部分被上傳。

4; 沒有文件被上傳。

5; 上傳文件大小為0。

另外,查詢PHP參考手冊關於move_uploaded_file函數的介紹如下:

move_uploaded_file

(PHP 4 >= 4.0.3, PHP 5)

move_uploaded_file — 將上傳的文件移動到新位置


說明

bool move_uploaded_file ( string $filename , string $destination )

本函數檢查並確保由 filename 指定的文件是合法的上傳文件(即通過 PHP 的 HTTP POST 上傳機制所上傳的)。如果文件合法,則將其移動為由 destination 指定的文件。 

這種檢查顯得格外重要,如果上傳的文件有可能會造成對用戶或本系統的其他用戶顯示其內容的話。 


參數


filename
上傳的文件的文件名。 
destination
移動文件到這個位置。 



返回值

成功時返回 TRUE。 

如果 filename 不是合法的上傳文件,不會出現任何操作, move_uploaded_file() 將返回 FALSE。 

如果 filename 是合法的上傳文件,但出於某些原因無法移動,不會出現任何操作, move_uploaded_file() 將返回 FALSE。此外還會發出一條警告。 

范例

Example #1 Uploading multiple files

 $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}
?> 

原因終於找到瞭,是因為我上傳瞭一個超過32768Bytes即32KB大小的Penguins.jpg文件導致出現$_FILES[‘screenshot’][‘error’]為2的錯誤,並且$_FILES[‘screenshot’][‘tmp_name’]為空,move_uploaded_file($_FILES[‘screenshot’][‘tmp_name’],
$target)函數調用時返回FALSE,if (move_uploaded_file($_FILES[‘screenshot’][‘tmp_name’], $target)) {

}代碼塊沒有執行。

發佈留言