PHP表单中的大文件上载会中断提交

PHP表单中的大文件上载会中断提交,php,forms,file-upload,Php,Forms,File Upload,我有一个简单的PHP表单,可以通过电子邮件发送一些文本数据和一个文件附件。我相信,只要上传没有突破服务器上的任何限制(如大小或执行时间),一切都正常。当文件突破这些限制时,浏览器显示上传0%-100%很好,但页面只是刷新,没有发送POST数据,而不是提交表单 我没有增加任何限制的选择。我正在处理一个无法通过php.ini、.htaccess或ini_set()增加上传大小或执行时间限制的项目。这很好,我同意这个客户的托管公司给我的限制 然而,当用户试图上传一个超出限制的大文件时,我只需要一种用户

我有一个简单的PHP表单,可以通过电子邮件发送一些文本数据和一个文件附件。我相信,只要上传没有突破服务器上的任何限制(如大小或执行时间),一切都正常。当文件突破这些限制时,浏览器显示上传0%-100%很好,但页面只是刷新,没有发送POST数据,而不是提交表单

我没有增加任何限制的选择。我正在处理一个无法通过php.ini、.htaccess或ini_set()增加上传大小或执行时间限制的项目。这很好,我同意这个客户的托管公司给我的限制

然而,当用户试图上传一个超出限制的大文件时,我只需要一种用户友好的方式来提交表单,而不是完全停止执行,页面刷新而没有POST数据。此时,我甚至不能在提交时向用户显示任何错误,例如“文件必须小于10MB”,因为当文件太大时,表单实际上不会被发布


如果需要任何澄清,请告诉我。

显然,如果您的脚本用于将文件作为电子邮件附件发送,那么您的文件应该在10分钟以下,因为许多邮件服务器会拒绝较大的电子邮件

出于安全原因,您无法从浏览器访问有关文件的信息。但一旦在表单的文件字段中选择了文件,就可以使用HTML5文件API

以下是提交前需要处理文件大小的代码部分:

<input type="file" id="a_file" name="a_file" />
<script>
  function fileSelect(evt) {
    var file = evt.target.files[0];
    var size_mo = (file.size / (1024 * 1024)).toFixed(3);

    if (size_mo >= 10)
    {
        alert('Your file is too big ('+size_mo+'Mo).');
        // eventually reset the form with window.your_form.reset() to avoid submit
    }
    else
    {
        alert('Your file is ready for upload ('+size_mo+'Mo)');
    }
  }
document.getElementById('a_file').addEventListener('change', fileSelect, false);
</script>

函数文件选择(evt){
var file=evt.target.files[0];
var size_mo=(file.size/(1024*1024)).toFixed(3);
如果(尺寸大于等于10)
{
警报('您的文件太大('+size_-mo+'mo.));
//最终使用window.your_form.reset()重置表单以避免提交
}
其他的
{
警报('您的文件已准备好上载('+size\u mo+'mo');
}
}
document.getElementById('a_file')。addEventListener('change',fileSelect,false);
但是,此解决方案仅支持最新浏览器,并且与低于10的Internet Explorer版本不兼容

没有其他使用HTML或JS的解决方案。如果你想得到全面的支持,你需要Flash或Java(请记住,还有一些电脑没有安装这些技术)。
因此,您最好使用HTML5代码进行浏览器检测,如果您无法读取文件大小,并且在支持HTML5的情况下表现良好,则不要警告用户。

它应该抛出一个您可以捕获的
UPLOAD\u ERR\u INI\u size
错误。我假设是大小导致了问题,但我在日志中没有看到任何错误。除了尺寸之外,还有什么其他原因导致它?记忆?执行时间?我希望我至少会看到一些错误,但我没有。可能是权限问题吗?你有权上传到你要上传的目录吗?@doliver不确定。我没有保存文件,只是上传时从tmp目录中引用了它。另外,它可以很好地处理较小的文件,所以我认为这不是问题所在。这个解决方案看起来很棒,但是这个特定的客户端有很多ie7-ie9流量,不支持HTML5文件API。这些浏览器还有其他解决方案吗?Ref:@jackrugile使用支持IE9或更低版本的HTML或JS无法做到这一点。如果您使用Java小程序请求读取文件系统的权限,或者使用Flash应用程序,您可以这样做。@jackrugile我更新了我的答案。现在已经完成了。