我很惊讶在错误日志中找到上述错误,因为我认为我已经完成了必要的工作来捕获PHP脚本中的错误:
if ($_FILES['image']['error'] == 0)
{
// go ahead to process the image file
}
else
{
// determine the error
switch($_FILES['image']['error'])
{
case "1":
$msg = "Uploaded file exceeds the upload_max_filesize directive in php.ini.";
break;
....
}
}
在我的PHP.ini脚本中,相关设置为:
memory_limit = 128M
post_max_size = 3M
upload_max_filesize = 500K
我知道3M相当于3145728字节,这就是触发错误的原因。如果文件大小超过500k但小于3M,则PHP脚本将能够按正常运行,并根据$msg
在case 1
中发出错误消息。
当帖子大小超过post_max_size
但仍然在内存限制范围内时,如何捕获此错误而不是让脚本突然终止并发出PHP警告?我查看了类似的问题here,here和here,但未找到答案。
答案 0 :(得分:15)
找到一种不直接处理错误的替代解决方案。以下代码由软件工程师Andrew Curioso在blog:
中编写if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&
empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0)
{
$displayMaxSize = ini_get('post_max_size');
switch(substr($displayMaxSize,-1))
{
case 'G':
$displayMaxSize = $displayMaxSize * 1024;
case 'M':
$displayMaxSize = $displayMaxSize * 1024;
case 'K':
$displayMaxSize = $displayMaxSize * 1024;
}
$error = 'Posted data is too large. '.
$_SERVER[CONTENT_LENGTH].
' bytes exceeds the maximum size of '.
$displayMaxSize.' bytes.';
}
正如他的文章中所解释的,当帖子大小超过post_max_size
时,$_POST
和$_FILES
的超全局数组将变为空。因此,通过测试这些并确认使用POST方法发送了一些内容,可以推断出发生了这样的错误。
实际上有一个类似的问题here,我之前没有找到。
答案 1 :(得分:1)
你可以在上传之前先用javascript检查一下吗?
// Assumed input for file in your HTML
<input type="file" id="myFile" />
//binds to onchange event of your input field
$('#myFile').bind('change', function() {
alert(this.files[0].size);
});
你也可以试一试:
try
{
if (!move_uploaded_file( 'blah blah' ))
{
throw new Exception('Too damn big.');
}
// Can do your other error checking here...
echo "Upload Complete!";
}
catch (Exception $e)
{
die ('File did not upload: ' . $e->getMessage());
}