【问题标题】:Large File Upload in PHP Form Breaks Submission [duplicate]PHP表单中的大文件上传中断提交[重复]
【发布时间】:2013-04-23 16:31:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 它应该抛出一个你可以捕获的UPLOAD_ERR_INI_SIZE 错误。
  • 我认为是导致问题的大小,但我在日志中没有看到任何错误。除了尺寸还有什么可能导致它?记忆?执行时间处理时间?希望我至少会看到一些错误,但我没有。
  • 可能是权限问题?您是否有权上传到您要上传到的目录?
  • @doliver 不确定。我没有保存文件,它只是在上传时从 tmp 目录中引用。此外,它适用于较小的文件,所以我认为这是问题所在。

标签: php forms file-upload


【解决方案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 时具有良好的行为,请不要提醒用户。

【讨论】:

  • 这个解决方案看起来不错,但是这个特定的客户端有很多 ie7 - ie9 流量,不支持 HTML5 文件 API。这些浏览器的任何其他解决方案?参考:caniuse.com/fileapi
  • @jackrugile 使用支持 IE9 或更低版本的 HTML 或 JS 无法做到这一点。如果您使用 Java Applet 请求读取文件系统的权限或使用 Flash 应用程序,则可以。
  • @jackrugile 我更新了我的答案。所以它现在已经完成了。
猜你喜欢
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多