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

时间:2013-04-22 20:21:42

标签: php forms file-upload

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

我没有选择增加任何限制。我正在开发一个项目,我无法通过php.ini,.htaccess或ini_set()增加上传大小或执行时间的限制。这很好,我对这个特定客户的托管公司给予我的限制感到满意。

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

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

1 个答案:

答案 0 :(得分:1)

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

出于安全原因,您无法从浏览器访问有关文件的信息。但是只要在表单的文件字段中选择文件,就可以使用HTML5文件API。 See this page for a complete presentation

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

<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>

但是,此解决方案仅支持最新的浏览器,并且与低于10的Internet Explorer版本不兼容。

没有其他使用HTML或JS的解决方案。如果您需要完全支持,则需要Flash或Java(请记住,还有未安装这些技术的计算机)。 因此,您可以做的最好的事情是使用HTML5代码和浏览器检测,如果您无法读取文件大小并且在支持HTML5时具有良好的行为,则不会向用户发出警告。