ホームページ  >  記事  >  バックエンド開発  >  PHP アップロード ファイルが最大ファイル制限を超えているため、正常にアップロードできません

PHP アップロード ファイルが最大ファイル制限を超えているため、正常にアップロードできません

WBOY
WBOYオリジナル
2016-06-13 12:01:41844ブラウズ

PHP によってアップロードされたファイルがファイルの最大制限を超えているため、正常にアップロードできません

現在、書籍「HeadFirst PHP & MySQL」の第 5 章「ファイルに保存されたデータの使用」を学習し、ファイルを実行しています。アップロードを申請する際にエラーが発生し、ファイルを正常にアップロードできませんでした。この問題は長い間私を悩ませてきましたが、幸いなことに、最終的には解決されました。原因は、アップロードした画像ファイルのサイズが、HTML フォームの MAX_FILE_SIZE オプションで指定した値 32768Bytes (32KB) を超えているため、アップロードが成功しないためです。

PHP IDE 開発環境として XAMPP (Apache + MySQL + PHP + Perl) 統合開発パッケージと Zend Studio 10.6 を使用しました。また、PHP のデバッグには XDebug を使用しました。 Zend Studio10 .6 で Xdebug の PHP デバッグ環境を構成するには、ブログ投稿「Zend Studio 10.5 および XDebug Debugging | Zend Debugger Explaining Drupal Source Code (1)」を参照しました。

対応するファイルアップロード例 PHP コード addscore.php は次のとおりです:

<!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 &#39;appvars.php&#39;;  require_once &#39;connectvars.php&#39;;		  if (isset($_POST[&#39;submit&#39;])) {    // Grab the score data from the POST    $name = $_POST[&#39;name&#39;];    $score = $_POST[&#39;score&#39;];    $screenshot = $_FILES[&#39;screenshot&#39;][&#39;name&#39;];        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[&#39;screenshot&#39;][&#39;tmp_name&#39;], $target)) {       	// Connect to the database		$dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) 		    or die(&#39;Error Connecting to MySQL Database!&#39;);		// Write the data to the database		$query = "INSERT INTO guitarwars VALUES (0, NOW(), &#39;$name&#39;, &#39;$score&#39;,&#39;$screenshot&#39;)";		mysqli_query($dbc, $query) or die(&#39;Error querying database;&#39;);		// Confirm success with the user		echo &#39;<p>Thanks for adding your new high score!</p>&#39;;		echo &#39;<p><strong>Name:</strong> &#39; . $name . &#39;<br />&#39;;		echo &#39;<strong>Score:</strong> &#39; . $score;		echo &#39;<img src="&#39; . GW_UPLOADPATH . $screenshot . &#39;" alt="Score image" /></p>&#39;;		echo &#39;<p><a href="index.php"><< Back to high scores</a></p>&#39;;		// Clear the score data to clear the form		$name = "";		$score = "";		$screenshot = "";		mysqli_close($dbc);      }    }    else {      echo &#39;<p class="error">Please enter all of the information to add your high score.</p>&#39;;    }  }?>  <hr />  <form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER[&#39;PHP_SELF&#39;]; ?>">  	<input type="hidden" name="MAX_FILE_SIZE" value="32768" />    <label for="name">Name:</label>    <input type="text" id="name" name="name" value="<?php if (!empty($name)) echo $name; ?>" /><br />    <label for="score">Score:</label>    <input type="text" id="score" name="score" value="<?php if (!empty($score)) echo $score; ?>" /><br />    <label for="screeshot">ScreenShot</label>    <input type="file" id="screenshot" name="screenshot" />    <hr />    <input type="submit" value="Add" name="submit" />  </form></body> </html>

Zend を使用する場合Sutdio10. 6. ブレークポイントを設定して上記の PHP コードをデバッグすると、「if (move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)) {」行のコード ブロックが実行されていないことがわかりました。そこで、次のように、スーパー グローバル変数 $_FILES['screenshot']['tmp_name'] の値が空であることを確認し、このコード行の前に $_FILES 変数の値を JSON 形式で出力します。
{"screenshot":{"name":"Penguins.jpg","type":"","tmp_name":"","error":2,"size":0}}

対応する実行中のスクリーンショットは次のとおりです:


その後、$_FILES['screenshot']['error'] が 2 であることを確認し、$_FILES スーパー グローバルの概要をオンラインで確認しました。変数 はおおよそ次のとおりです。

$_FILES システム関数の一般的な使用法PHP プログラミング言語では次のようになります。
$_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

<?php$uploads_dir = &#39;/uploads&#39;;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");    }}?> 
原因终于找到了,是因为我上传了一个超过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)) { 
  ...
 }代码块没有执行。



     

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。