大型 .PDF 文件未通过 PHP 作为中等 BLOB 上传到 MySQL 数据库,2MB 以下的文件工作正常

dba*_*ugh 5 php mysql apache blob

我正在开发一个 PHP 脚本,用于通过 PHP 将 .PDF 文档作为中等 BLOB 上传到 MySQL 数据库中。该脚本还允许用户搜索文件并打开/下载它们,但我认为该部分脚本与我的问题无关。该脚本适用于小于 2 MB 的文件,但是一旦我尝试上传超过 2 MB 的文件,我的内容(中型 BLOB)列中就没有任何内容,并且 mime 类型没有任何值。我已经尝试将 MySQL 服务器的 max_packet_size 从其默认值 1 MB 增加到 4 MB。我也将 php.ini 更新为正确的值,我想。我将 upload_max_size 设置为 4MB,post_max_size 设置为 4 MB,memory_limit 设置为 16 MB。我没有

我还尝试使用 errorInfo() 和 errorCode() 并通过 0(无错误)从脚本中的 PDO 对象中捕获错误。

这是我的脚本的上传部分:

if ($key == 'upload')
{
    set_time_limit(0);
    $_SESSION['upload'] = $value;

    if ($_FILES['userfile']['name'])
    {
        $fileName = $_FILES['userfile']['name'];
        $tmpName  = $_FILES['userfile']['tmp_name'];
        $fileSize = $_FILES['userfile']['size'];
        $fileType = $_FILES['userfile']['type'];
        $docType = $_POST['docType'];
        $netKey = $_POST['netKey'];
        $fp       = fopen($tmpName, 'r');
        $content  = fread($fp, filesize($tmpName));
        $content  = addslashes($content);
        fclose($fp);

        $_SESSION['filetype'] = $fileType;

        if(!get_magic_quotes_gpc())
        {
            $fileName = addslashes($fileName);
        }
        $sqlCheck = "SELECT id, name, documentType, networkKey FROM upload WHERE active='1'";
        foreach ($dbh->query($sqlCheck) as $row)
        {
            if (($row['name'] == $fileName) && ($row[networkKey] == $netKey) && ($row['documentType'] == $docType)) 
            {
                $_SESSION['updateRow'] = $row['id'];
            }

        }

        if ($_SESSION['updateRow'])
            {
                $deactivateDuplicate = "UPDATE upload SET active = 0, modifiedBy = '".strtoupper($_SERVER['REMOTE_USER'])."', modifiedDate = Now() WHERE id = '".$_SESSION['updateRow']."' AND active ='1'";
                $dbh->query($deactivateDuplicate);
                $_SESSION['sql'] = "SELECT id, name, documentType, type, size, networkKey, modifiedBy, modifiedDate, active FROM upload WHERE active = '1'";
                $_SESSION['uploadSearch'] = 1;
                $_SESSION['updateRow'] = 0;
            }
            $values = "'".$fileName."','".$docType."','".$fileType."','".$content."','".$fileSize."','".$netKey."','".strtoupper($_SERVER['REMOTE_USER'])."', Now(), 1";
            $sqlUpload = "INSERT INTO upload (name, documentType, type, content, size, networkKey, modifiedBy, modifiedDate, active) VALUES (".$values.")";
            $dbh->query($sqlUpload);

            $_SESSION['sql'] = "SELECT id, name, documentType, type, size, networkKey, modifiedBy, modifiedDate, active FROM upload WHERE active = '1'";
            $_SESSION['uploadSearch'] = 1;


    }
}
Run Code Online (Sandbox Code Playgroud)

这是应用程序的前端,显示较小的文件有效,而较大的文件无效。文件 sample.pdf 小于 1 MB,文件 test.pdf 为 2.5 MB。

http://www.imagechicken.com/viewpic.php?p=1255628359017775300&x=png

我会使用 img 标签,但可惜我是新用户,不允许使用。

接下来我要寻找的是 Apache 中限制文件大小的设置。我是 LAMP 的新手,所以任何提示都会很棒。谢谢

dba*_*ugh 2

我实际上解决了这个问题。我更改了 php.ini 和 my.cnf 中推荐的所有值,但我还需要更改 PDO 的设置。

我更改了:PDO::MYSQL_ATTR_MAX_BUFFER_SIZE(整数)最大缓冲区大小。默认为 1 MiB。

必须在创建 PDO 对象时设置此项才能工作。现在一切都很好。