PHP大文件上传不通过

时间:2014-03-24 09:01:36

标签: php forms file-upload

这里发生了什么?我有一个表格可以正常地用于较小的文件,但是当我尝试上传更大的文件时,表单就会失败。我不知道这个大小限制是什么,但它肯定不适用于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)导致数组(0){}

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

2 个答案:

答案 0 :(得分:2)

检查php.ini中的限制,有多个设置要查找 -

upload_max_filesize = 64M
post_max_size = 64M

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

答案 1 :(得分:0)

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

ini_set('max_execution_time', [seconds]);

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

对不起,刚刚注意到你已经完成了这件事。

error_log中有什么内容吗?