Home >Backend Development >PHP Tutorial >PHP cannot upload files successfully, $_FILES['screenshot']['tmp_name'] is empty_PHP Tutorial
Recently, I was studying Chapter 5 of the book "HeadFirst PHP & MySQL", "Using Data Stored in Files", and when I was making a file upload application, an error occurred, that is, the file could not be uploaded successfully. This problem has troubled me for a long time, but fortunately it was finally solved. The reason is that the size of the image file I uploaded exceeds the value specified by the MAX_FILE_SIZE option in the HTML form, 32768Bytes, which is 32KB, so the upload cannot be successful.
I used XAMPP (Apache + MySQL + PHP + Perl) integrated development package and Zend Studio 10.6 is used as the PHP IDE development environment. In addition, I used XDebug for PHP debugging. To configure it in Zend Studio 10.6, I referred to the blog post Zend Studio 10.5 and XDebug Debugging | Zend Debugger Description Drupal Source Code (1)
My PHP code for addscore.php is as follows:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Guitar Wars - Add Your High Score</title> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <h2>Guitar Wars - Add Your High Score</h2> <?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 <br />"; // echo "score: $score <br />"; // echo "screenShot: $screenshot <br />"; 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 '<p>Thanks for adding your new high score!</p>'; echo '<p><strong>Name:</strong> ' . $name . '<br />'; echo '<strong>Score:</strong> ' . $score; echo '<img src="http://blog.csdn.net/ccf19881030/article/details/' . GW_UPLOADPATH . $screenshot . '" alt="Score image" /></p>'; echo '<p><< Back to high scores</p>'; // Clear the score data to clear the form $name = ""; $score = ""; $screenshot = ""; mysqli_close($dbc); } } else { echo '<p class="error">Please enter all of the information to add your high score.</p>'; } } ?> <hr /> </body> </html>
{"screenshot":{"name":"Penguins.jpg","type":"","tmp_name":"","error":2,"size":0}}
The screenshot is as follows:
Then I checked that $_FILES["screenshot']['error'] was 2. I checked online and found that the $_FILES super global variable is roughly as follows:
Common usages of the $_FILES system function in the PHP programming language are: $_FILES['myFile']['name'] displays the original name of the client file. $_FILES['myFile']['type'] The MIME type of the file, for example "image/gif". $_FILES['myFile']['size'] The size of the uploaded file, in bytes. $_FILES['myFile']['tmp_name'] is the name of the temporary file stored, which is usually the system default. $_FILES['myFile']['error'] This is the error code related to file upload. The following is what the different codes mean: 0; File uploaded successfully. 1; The file size exceeds the size set by the system in php.ini. 2; File size exceeded The value specified by the MAX_FILE_SIZE option. 3; Only part of the file was uploaded. 4; No files were uploaded. 5; The uploaded file size is 0.In addition, check the PHP reference manual for the introduction of the move_uploaded_file function as follows:
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
<?php $uploads_dir = '/uploads'; foreach ($_FILES["pictures"]["error"] as $key => $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"); } } ?>The reason was finally found. It was because I uploaded a Penguins.jpg file that exceeded 32768Bytes or 32KB, which caused an error of $_FILES['screenshot']['error'] being 2, and $_FILES['screenshot' ]['tmp_name'] is empty, move_uploaded_file($_FILES['screenshot']['tmp_name'], $target) function returns FALSE when called, if (move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)) {