【问题标题】:PHP large file uploads not going throughPHP大文件上传不通过
【发布时间】:2014-03-24 09:01:36
【问题描述】:

这里发生了什么?我有一个表单,它可以精确地用于较小的文件,但是一旦我尝试上传更大的文件,表单就会失败。我不知道这个大小限制是多少,但它绝对不适用于 40MB 的文件。

普通文件返回错误 0,表示它们已成功上传,但对于大文件,我什至没有收到错误。就好像表单中的任何内容都没有通过,这也包括表单中所有其他输入的值。大文件有些东西会完全阻止表单中的任何内容工作。

我已经检查了我的 php.ini 以确保 upload_max_filesize 和 post_max_size 值足够高,它们是(每个 200M)。由于此服务器是本地服务器,并且我测试的文件会立即“上传”,但我还确保 max_execution_time 也足够高(1200)。

表单使用POST,enctype是multipart/form-data,我已经尝试过使用只有文件输入和提交按钮的表单。

这是上传代码(即表单重定向到的操作页面中的代码):

<?php

require_once($_SERVER['DOCUMENT_ROOT'] . '/resources/recaptchalib.php');
$privatekey = "abc123";
$resp = recaptcha_check_answer($privatekey, 
        $_SERVER["REMOTE_ADDR"],
        $_POST["recaptcha_challenge_field"],
        $_POST["recaptcha_response_field"]);
if (!$resp->is_valid) {
    echo "<h1>" . $content['UploadError'] . "</h1>"
            . $content['UploadCaptcha'] . "<br><br>"
            . $content['UploadReturn'];
} else {
    $name = $_POST['name'];
    $email = $_POST['email'];
    if (empty($name)) {
        echo "<h1>" . $content['UploadError'] . "</h1>" .
                $content['UploadName'] . "<br><br>" .
                $content['UploadReturn'];
    } elseif (empty($email)) {
        echo "<h1>" . $content['UploadError'] . "</h1>"
                . $content['UploadEmail'] . "<br><br>"
                . $content['UploadReturn'];
    } else {
        $url = $_POST['url'];
        $notes = $_POST['notes'];
        $timedate = date('YmdHis');
        $dbHandle = new PDO("mysql:host=localhost;dbname=upload;", "user", "pass",
                array(PDO::ATTR_EMULATE_PREPARES => false));
        $dbHandle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $query = $dbHandle->prepare("INSERT INTO `data` "
                . "(approved,name,email,fileid,url,notes,timedate,viewcount) "
                . "VALUES(?,?,?,?,?,?,?,?)");
        $types = array(
            'jpg', 'jpeg', 'gif', 'png',
            'mp3', 'wma', 'wav', 'ogg', 'aac', 'flac',
            'avi', 'wmv', 'mov', 'ogg', 'webm', 'mpg', 'mpeg', 'mp4'
        );
        $filechk = (isset($_FILES['file']) && !empty($_FILES['file']['name']));
        $urlchk = (isset($url) && !empty($url));
        if (!$filechk ^ $urlchk) {
            echo "<h1>" . $content['UploadError'] . "</h1>"
                    . $content['UploadFileURL'] . "<br><br>"
                    . $content['UploadReturn'];
        } elseif ($filechk) {
            $filesize = (75 * 1024 * 1024);
            $up_path = $_SERVER['DOCUMENT_ROOT'] . '/resources/uploads/';
            $filename = $timedate . $_FILES['file']['name'];
            $ex = explode(".", $filename);
            $ext = strtolower(end($ex));
            if (file_exists($up_path . $filename)) {
                $filename = $timedate . 'Duplicate.' . $ext;
            }
            if (!in_array($ext, $types)) {
                echo "<h1>" . $content['UploadError'] . "</h1>"
                        . $content['UploadFileType'] . "<br><br>"
                        . $content['UploadReturn'];
            } elseif (filesize($_FILES['file']['tmp_name']) > $filesize) {
                echo "<h1>" . $content['UploadError'] . "</h1>" 
                        . $content['UploadFileSize'] . ($filesize / 1024 / 1024) . " MB<br><br>"
                        . $content['UploadReturn'];
            } elseif (!is_writable($up_path)) {
                echo "<h1>" . $content['UploadError'] . "</h1>"
                        . $content['UploadWriteError'] . "<br><br>"
                        . $content['UploadReturn'];
            } elseif (move_uploaded_file($_FILES['file']['tmp_name'], $up_path . $filename)) {
                $fileid = $filename;
                $url = null;
                $query->execute(array('N', $name, $email, $fileid, $url, $notes, $timedate, '0'));
                echo "<h1>" . $content['UploadSuccess'] . "</h1>" 
                        . $content['UploadHomepage'];
            } else {
                echo "<h1>" . $content['UploadUnknownError'] . "</h1>" 
                        . $content['UploadReturn'];
            }
        } else {
            $fileid = null;
            $query->execute(array('N', $name, $email, $fileid, $url, $notes, $timedate, '0'));
            echo "<h1>" . $content['UploadSuccess'] . "</h1>" 
                    . $content['UploadHomepage'];
        }
    }
}
?>

var_dump($_FILES) 结果为 array(0) { }

所以我的 php.ini 似乎很好,我的代码似乎很好(因为我可以上传较小的文件)...我在这里缺少什么?

【问题讨论】:

  • 你能把你的$_FILES转储吗?
  • 你的磁盘一定有大小问题?
  • 磁盘没问题。 @Maerlyn:怎么样?
  • @Hiigaran 在上传后执行var_dump($_FILES) 并使用输出更新您的问题。
  • 完成。将结果转储到 array(0) { }

标签: php forms file-upload


【解决方案1】:

检查 php.ini 中的限制,要查找的设置不止一种 -

upload_max_filesize = 64M
post_max_size = 64M

确保重新启动 apache 以使设置更改生效。

【讨论】:

    【解决方案2】:

    您是否更改了脚本可以运行的时间限制?处理大图像可能需要一段时间,如果最大时间限制未更改为默认值(通常为 30 秒),则脚本可能会超时。您可以使用:

    ini_set('max_execution_time', [seconds]);

    其中 seconds 是停止脚本之前等待的最大秒数。

    抱歉,刚刚注意到你已经这样做了。

    你的error_log有什么东西吗?

    【讨论】:

    • 在哪里可以找到日志?
    • 如果你运行的是 apache,它最像 /var/log/apache2/error.log,除非你在你的 apache 配置中有自定义日志设置
    • 这很不寻常。我看到的错误消息表明我的 post_max_size 仍然设置得太低(即使它是 200M):[Mon Mar 24 10:10:01.165117 2014] [:error] [pid 28096] [client 127.0.0.1:54295] PHP Warning: POST Content-Length of 43173492 bytes exceeds the limit of 8388608 bytes in Unknown on line 0, referer: http://localhost/submit.php
    • 这取决于您使用的是哪个 php.ini,因为可能不止一个。我建议使用 php_info(); 创建一个信息页面;并检查这些变量设置为什么
    • 是的,它显示的似乎是默认值,就好像我从未更改过它们一样。如果是这种情况,我在哪里可以找到其他 php.ini 文件?编辑:找到了。固定的。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多