最近在学习《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如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Guitar Wars - Add Your High Score</title>
  7. <link rel="stylesheet" type="text/css" href="style.css" />
  8. </head>
  9. <body>
  10. <h2>Guitar Wars - Add Your High Score</h2>
  11. <?php
  12. require_once 'appvars.php';
  13. require_once 'connectvars.php';
  14. if (isset($_POST['submit'])) {
  15. // Grab the score data from the POST
  16. $name = $_POST['name'];
  17. $score = $_POST['score'];
  18. $screenshot = $_FILES['screenshot']['name'];
  19. if (!empty($name) && !empty($score) && !empty($screenshot)) {
  20. // Move the file to the target upload folder
  21. $target = GW_UPLOADPATH . $screenshot;
  22. echo json_encode($_FILES);
  23. if (move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)) {
  24. // Connect to the database
  25. $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
  26. or die('Error Connecting to MySQL Database!');
  27. // Write the data to the database
  28. $query = "INSERT INTO guitarwars VALUES (0, NOW(), '$name', '$score','$screenshot')";
  29. mysqli_query($dbc, $query) or die('Error querying database;');
  30. // Confirm success with the user
  31. echo '<p>Thanks for adding your new high score!</p>';
  32. echo '<p><strong>Name:</strong> ' . $name . '<br />';
  33. echo '<strong>Score:</strong> ' . $score;
  34. echo '<img src="' . GW_UPLOADPATH . $screenshot . '" alt="Score image" /></p>';
  35. echo '<p><a href="index.php"><< Back to high scores</a></p>';
  36. // Clear the score data to clear the form
  37. $name = "";
  38. $score = "";
  39. $screenshot = "";
  40. mysqli_close($dbc);
  41. }
  42. }
  43. else {
  44. echo '<p class="error">Please enter all of the information to add your high score.</p>';
  45. }
  46. }
  47. ?>
  48. <hr />
  49. <form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  50. <input type="hidden" name="MAX_FILE_SIZE" value="32768" />
  51. <label for="name">Name:</label>
  52. <input type="text" id="name" name="name" value="<?php if (!empty($name)) echo $name; ?>" /><br />
  53. <label for="score">Score:</label>
  54. <input type="text" id="score" name="score" value="<?php if (!empty($score)) echo $score; ?>" /><br />
  55. <label for="screeshot">ScreenShot</label>
  56. <input type="file" id="screenshot" name="screenshot" />
  57. <hr />
  58. <input type="submit" value="Add" name="submit" />
  59. </form>
  60. </body>
  61. </html>

在使用Zend Sutdio10.6设置断点并调试上面这段PHP代码时我发现“if (move_uploaded_file($_FILES['screenshot']['tmp_name'], $target)) {”这行代码里面的代码块没有执行,于是查看了超全局变量$_FILES['screenshot']['tmp_name']的值为空,然后我在这行代码前以JSON格式打印出$_FILES变量的值,如下:

  1. {"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函数的介绍如下:

  1. move_uploaded_file
  2. (PHP 4 >= 4.0.3, PHP 5)
  3. move_uploaded_file 将上传的文件移动到新位置
  4. 说明
  5. bool move_uploaded_file ( string $filename , string $destination )
  6. 本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination 指定的文件。
  7. 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。
  8. 参数
  9. filename
  10. 上传的文件的文件名。
  11. destination
  12. 移动文件到这个位置。
  13. 返回值
  14. 成功时返回 TRUE
  15. 如果 filename 不是合法的上传文件,不会出现任何操作, move_uploaded_file() 将返回 FALSE
  16. 如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作, move_uploaded_file() 将返回 FALSE。此外还会发出一条警告。

范例

Example #1 Uploading multiple files

  1. <?php
  2. $uploads_dir = '/uploads';
  3. foreach ($_FILES["pictures"]["error"] as $key => $error) {
  4. if ($error == UPLOAD_ERR_OK) {
  5. $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
  6. $name = $_FILES["pictures"]["name"][$key];
  7. move_uploaded_file($tmp_name, "$uploads_dir/$name");
  8. }
  9. }
  10. ?>

原因终于找到了,是因为我上传了一个超过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上传文件超过文件最大限制导致无法上传成功的更多相关文章

  1. PHP上传文件超过了最大文件大小限制导致无法上传成功

    最近的研究<HeadFirst PHP & MySQL>第一本书5章"使用存储在文件中的数据",难道当一个文件上传应用程序,发生了错误.即,文件不能成功上传.这 ...

  2. springMVC文件上传大小超过限制的问题

    [转自]https://my.oschina.net/ironwill/blog/646762 springMVC是一个非常方便的web层框架,我们使用它的文件上传也非常的方便. 我们通过下面的配置来 ...

  3. Github上传大文件(超过100M)

    上传大文件(超过100M)到Github 笔者上传操作100M的文件到Github,结果在push的时候会自动终止.然后提示无法上传大文件,就算删除再提交也是报错. 于是,本人写这篇博客就是为了解决这 ...

  4. web应用程序上传文件 超过了最大请求长度

    具体问题如下图 具体问题描述:在web应用程序中,上传了200M的文件,出现了如上图的问题,上传较小文件的时候,没有任何的问题.但是,测试的能力,不容小觑,真真的会测试的很全面.测试到了这个问题,好吧 ...

  5. php文件上传之多文件上传

    在胡说之前,首先声明,本文是建立在掌握php单文件上传的基础上,所以这里就不赘述文件上传服务器配置,表单设置该注意的地方了. 话不多少,直入主题,在请求页面方面有两种写法(只呈现表单部分,以上传三个文 ...

  6. php文件上传之单文件上传

    为了简单一些,php文件跟form表单写在了一个文件里. php单文件上传----> <!DOCTYPE html> <html> <head> <me ...

  7. 框架基础:ajax设计方案(三)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组

    马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...

  8. Struts1文件上传、单文件、多文件上传【Struts1】

     将struts1文件上传的操作汇总了一下,包括单文件上传和多文件上传,内容如下,留作备忘: Struts2实现文件上传的文章(http://blog.csdn.net/itwit/article/d ...

  9. Web应用:当文件超过100KB,无法上传,有种原因你想象不到

    今天下午2点多,突然发现凡是文件超过100KB的,在上传的时候都会卡住,但低于100KB的文件可以上传成功. 服务器端使用的是asp无组件上传,为什么突然出现这种问题呢? 我们知道,IIS默认上传限制 ...

随机推荐

  1. springboot 尚桂谷学习总结01

    ------springboot 技术入门------ 1.springboot 简介: 优点: 简化spring 应用开发的一个框架 整个spring技术栈的一个大整合 ------微服务----- ...

  2. 网络命令-nc(一)

    一直在linux环境下编程,但却没有用过nc命令,不过最近发现Netcat这个命令-nc,发现真的蛮强大的, 为了备忘,就写了这个博客吧,不求全,只求把自己觉得很有用的命令整理出来,这篇文章估计要长期 ...

  3. python+selenium+chromewebdriver或Firefox的环境搭建

    插件下载地址 chromewebdriver:https://chromedriver.storage.googleapis.com/index.html?path=2.26/放置在python下的S ...

  4. JS的部分部分疑问和小结

    2015/9/1 1.在字符串中没有可以所需要查找的"X"的时候,返回的值  java:lastIndexof -1  js: IndexOf undefined... 2015/ ...

  5. Web设计规范----控件、组件

    什么是控件?什么组件? 组件控件分类可以根据组件控件属性进行分类,也可以根据组件控件的功能进行划分.一般按功能划分,例如表单类就可以划分为:单文本输入,多文本输入.日历时间选择器.下拉选择列表.单选多 ...

  6. LeetCode Array Easy 219. Contains Duplicate II

    ---恢复内容开始--- Description Given an array of integers and an integer k, find out whether there are two ...

  7. linux 系统管理--进程管理

    目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...

  8. case when使用的总结

    https://blog.csdn.net/changxiangyangy/article/details/86718551 前几天,为了给产品分析当前用户数据结构,写sql的时候使用到了case w ...

  9. 离线安装gcc_rpm(centos下安装gcc的方法之一)

    .解压gcc_rpm.tar.gz (我的CSDN账号下载过) tar -zxvf gcc_rpm.tar.gz .解压完进入文件夹,执行以下命令,挨个执行(如果报依赖错误,就加上"--fo ...

  10. 数据库索引(BTree索引和Hash索引)

    索引 索引是为了方便查找我们所需要的数据. mysql支持的索引数据类型 B-Tree索引的特点 B-Tree索引以B+Tree(树)的结构存储数据. B-Tree索引能够加快数据的查询速度: B-T ...