PHP上传文件超过了最大文件大小限制导致无法上传成功
最近的研究《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例如以下:
<!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']; 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变量的值。例如以下:
{"screenshot":{"name":"Penguins.jpg","type":"","tmp_name":"","error":2,"size":0}}
对应的执行截图例如以下:
然后我查询$_FILES['screenshot']['error']为2。上网查询了一下,关于$_FILES超级全局变量的介绍大体例如以下:
另外,查询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 = '/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上传文件超过了最大文件大小限制导致无法上传成功的更多相关文章
- PHP上传文件超过文件最大限制导致无法上传成功
最近在学习<HeadFirst PHP & MySQL>一书的第5章"使用存储在文件中的数据",做一个文件上传的应用时,出现了错误,就是文件无法成功上传.这个问 ...
- asp.net上传文件超过了最大请求长度[转]
错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 解决方案 1. 修改web.config文件可以改变这个默认值 ...
- .net core部署到ubuntu 上传文件超过30MB
默认的上传文件不能超过30MB,需要修改几个地方 一.web.config中添加配置 <requestLimits maxAllowedContentLength="214748364 ...
- asp.net 上传文件超过了最大请求长度
今天系统遇到了一个问题,上传4m以上的文件,uploadify就会报错:超过了最大请求长度. 开始我以为是设置的大小,可是后来我看了uploadify的fileSizeLimit=1024*10,也就 ...
- Asp.net:上传文件超过了最大请求长度
错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 解决方案 1. 修改web.config文件可以改变这个默认值 ...
- .Net上传文件超过了最大请求长度
错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 修改web.config文件可以改变这个默认值为 <configuration&g ...
- elementUI 上传文件图片大小加了限制后 仍然上传了
https://blog.csdn.net/chanlingmai5374/article/details/80558444 看了这位老哥的说法 在看看文档 才发现自己没认真看文档 <el-u ...
- c#上传文件(一)使用 .net 控件上传文件
1.html代码: <body> <form id="form1" runat="server"> <div> <as ...
- web api 2.0 上传文件超过4M时,出现404错误
客户端代码 string path = "C:\\text.txt"; WebClient client = new WebClient(); Uri _address = new ...
随机推荐
- 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)
一.本课程是怎么样的一门课程(全面介绍) 1.1.课程的背景 作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...
- 基于visual Studio2013解决C语言竞赛题之1067间隔排序
题目 解决代码及点评 /* 功能:间隔元素排序.用随机函数产生25个[25,75]之间的整数, 把它送到一维数组M中. 要求对M[I],M[I+J],M[I+2*J],-这些元 ...
- smartforms换页,
smartforms换页,可以把最后的窗口设置成最终窗口, 这样页码有可以用系统变量控制: 总页码/页码 :&SFSY-FORMPAGES&
- win 8.1 安装 SQL server 遇到的各种问题
企业版 SQL Server ed2k://|file|cn_sql_server_2012_enterprise_edition_x86_x64_dvd_813295.iso|5054384128| ...
- 被忽视的META标签之特效
在web设计中使用js可以实现很多的页面特效,然而很多人却忽视了HTML标签中META标签的强大功效,其实meta标签也可以实现很多漂亮的页面过渡效果. META标签是HTML语言HEAD区的一个辅助 ...
- QT源码分析(从QApplication开始)
QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...
- oracle系统包——dbms_random用法及order by 小结(转)
dbms_random是一个可以生成随机数值或者字符串的程序包. 这个包有initialize().seed().terminate().value().normal().random().strin ...
- 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)
Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...
- 引用类中的enum
引用类中的enum 引用类中的enum,需要加类的域class_name::value_in_enum_name 点击(此处)折叠或打开 #include <stdio.h> #inclu ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...