在 PHP 中上传非常大的文件时没有错误?

问题描述 投票:0回答:7

我有一个用于上传文件的 PHP 表单,它工作正常,如果出现问题,会显示错误消息。这一切都很好。

问题是,当我使用一个非常大的文件进行测试时,它只是刷新页面,就好像我根本没有发送文件一样,并且表单中的 $_POST 变量都没有发送到服务器。

我想向用户显示错误,让他们知道文件太大。但是,我做不到。

有人知道发生什么事吗?

php upload
7个回答
13
投票

检查您的 PHP ini 文件,该文件控制 PHP 允许上传的文件大小。这些变量很重要:

  • 最大上传文件大小(upload_max_filesize)
  • 最大发布数据大小(post_max_size)
  • 内存限制(memory_limit)

任何超出这些范围的上传都将被忽略或出错,具体取决于您的设置。

文档中的这一部分有最好的摘要:http://ca3.php.net/manual/en/features.file-upload.common-pitfalls.php

编辑:另请注意,大多数浏览器不会发送大小超过 2GB 的上传内容。此链接已过时,但提供了一个想法:http://www.motobit.com/help/scptutl/pa98.htm。有人有这方面更好的信息来源吗?

服务器也可以施加限制,例如 Apache: http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestbody

要真正了解发生了什么,您可能应该检查网络服务器日志,检查浏览器上传限制(如果您使用的是 Firefox),并尝试查看

print_r($_FILES)
是否生成任何有用的错误号。如果所有其他方法都失败,请尝试使用 firebug 中的网络流量监视器。关键是确定请求是否发送到服务器,以及请求(包括标头)是否是这样的。一旦您已经了解了链中的所有内容,您就可以返回并查看 PHP 如何处理上传。


7
投票

您的 $_POST 很可能是空的,因为上传超出了 post_max_size 指令:

来自 PHP 的 指令页面

如果发布数据的大小较大 比 post_max_size,$_POST 并且 $_FILES 超全局变量是空的。 这可以通过多种方式进行跟踪, 例如通过将 $_GET 变量传递给 处理数据的脚本,即

<form
  action="edit.php?processed=1">
,以及 然后检查是否 $_GET['processed'] 已设定。


1
投票

在文件完全上传之前,您无法知道正在上传的文件的大小。因此,如果您想确定文件大小,然后显示大文件错误,首先必须上传文件,然后检查文件大小。为了上传大文件,您应该在 php 配置文件 php.ini 中设置 2 个设置。 打开它并搜索“upload_max_filesize”并将值设置为您想要的最大值。那么您必须设置 POST 参数的最大值,因为上传的文件是通过 HTTP POST 方法接收的。找到“post_max_size”并将其设置为一个较大的值。


1
投票

除了前用户回答的选项之外:

max upload filesize (upload_max_filesize)
max post data size (post_max_size)
memory limit (memory_limit)

还有一个,当文件很大,或者线路繁忙时,需要很多时间来执行这个操作,这会达到脚本执行限制的上限。

max_execution_time

0
投票

我将实现一个简单的脚本,该脚本定期进行 ajax 调用,以了解已完成多少上传。然后您可以实现某种进度条。网上有几个例子:

http://martinjansen.com/2007/04/28/file-upload-progress-bars-with-php/


0
投票

最大上传文件大小(upload_max_filesize) 最大发布数据大小 (post_max_size) 是您需要设置的指令。我已经用多个操作系统、浏览器等对其进行了测试,这是您唯一需要担心的两件事。


0
投票

这段代码对我有用。

/**
 * Converts KB, MB, GB, TB, etc. to Bytes
 */
function toByteSize($str)
{
    $str = strtoupper(trim($str));
    if (preg_match('/^\d+$/', $str)) {
        return (int)$str;
    }
    if (!preg_match('/^([0-9\.]+) *([aA-zZ]+)/', $str, $match)) {
        return NULL;
    }

    $arrU = [
        'B' => 0,
        'K' => 1, 'KB' => 1,
        'M' => 2, 'MB' => 2,
        'G' => 3, 'GB' => 3,
        'T' => 4, 'TB' => 4,
        'P' => 5, 'PB' => 5,
        'E' => 6, 'EB' => 6,
        'Z' => 7, 'ZB' => 7,
        'Y' => 8, 'YB' => 8
    ];

    if (!isset($arrU[$match[2]]) || ($match[2] == 'B' && intval($match[1]) != $match[1])) {
        return NULL;
    }

    return $match[1] * (1024 ** $arrU[$match[2]]);
}

/**
 * Check post content is exceed limit config post_max_size
 */
function is_post_exceeds_limit()
{
    if (!empty($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > toByteSize(ini_get("post_max_size"))) {
        return true;
    }

    return false;
}

try {
    if (is_post_exceeds_limit()) {
        throw new Exception("Content Length exceeds allowable limit", 1);
    }
} catch (\Throwable $th) {
    echo $th->getMessage();
}
© www.soinside.com 2019 - 2024. All rights reserved.