PHP上传文件超过了最大文件大小限制导致无法上传成功
2015-11-07 08:48
661 查看
最近的研究《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中配置Xdebug的PHP调试环境我參考了博文Zend Studio 10.5 与 XDebug 调试| Zend Debugger 说明 Drupal 源码 (一)一文。
对应的文件上传演示样例PHP代码addscore.php例如以下:
$target)函数调用时返回FALSE,if (move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)) {
...
}代码块没有运行。
我使用了XAMPP(Apache + MySQL + PHP + Perl)集成开发包和Zend
Studio 10.6作为PHP IDE开发环境,另外关于PHP调试我採用了XDebug,在Zend Studio10.6中配置Xdebug的PHP调试环境我參考了博文Zend Studio 10.5 与 XDebug 调试| Zend Debugger 说明 Drupal 源码 (一)一文。
对应的文件上传演示样例PHP代码addscore.php例如以下:
)) { // Grab the score data from the POST $name = $_POST['name']; $score = $_POST['score']; $screenshot = $_FILES['screenshot']['name']; 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="' . GW_UPLOADPATH . $screenshot . '" alt="Score image" /></p>'; echo '<p><a href="index.php"><< Back to high scores</a></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 /> <form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <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']的值为空。然后我在这行代码前以JSON格式打印出$_FILES变量的值。例如以下: 对应的执行截图例如以下: 然后我查询$_FILES['screenshot']['error']为2。上网查询了一下,关于$_FILES超级全局变量的介绍大体例如以下: PHP编程语言中的常见的$_FILES系统函数使用方法有: $_FILES['myFile']['name'] 显示client文件的原名称。 $_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函数的介绍例如以下: [code=plain]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"); } } ? >原因最终找到了。是由于我上传了一个超过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)) {
...
}代码块没有运行。
相关文章推荐
- PHP面向对象编程
- 夺命雷公狗ThinkPHP项目之----商城8商品品牌管理以及图片上传和分页
- php探针代码
- 夺命雷公狗ThinkPHP项目之----商城7后台登录控制以及注销
- 关于C#类中重写ToString方法和PHP类中__tostring()方法的比较
- 怎样增加phpmyadmin导入文件上限
- php实现点击可刷新验证码
- 详解PHP数组赋值方法
- PHP的curl常用的5个例子
- PHP 设置 setcookie
- Macbook Pro配置PHP开发环境
- PHP禁止浏览器缓存
- PHP中的数组处理函数
- 53. PHP 伪静态(2)
- PhP之路
- 理解PHP当中的cookie
- 关于PHP编译添加的扩展与外部扩展的问题
- php中==和===的区别
- php date函数
- PHP 5.6.15 编译安装