在旧版 MySQL 驱动程序中插入 BLOB 会导致“消失”错误

Posted

技术标签:

【中文标题】在旧版 MySQL 驱动程序中插入 BLOB 会导致“消失”错误【英文标题】:Inserting BLOB in legacy MySQL driver results in 'gone away' error 【发布时间】:2014-09-10 19:09:27 【问题描述】:

我按照this 教程制作了一个图片上传器。它工作正常,除非我尝试上传更大的文件大小:它只是将文件大小“更改”为 64KB,并且只显示较大图像的一小部分。所以,我google了一下,发现'blob'的最大文件大小为64kb,所以我将其更改为longblob,最大文件大小为4GB。

但现在,尝试上传大图像(1MB 或更大)时,我收到 SQL 错误“mysql 服务器已消失”。对于小于 1MB 的图像,上传工作正常。文件大小为 915kb 的 1400x900 图像可以上传,但文件大小为 1.6mb 的 1400x900 图像不会。文件大小为 1mb 的 250x179 的 gif 会上传。如果文件大小大于 1MB,php 中的 SQL 插入函数似乎不再连接:这怎么可能?

我的 php.ini 文件最大为 32MB,所以这不是问题。我正在使用 MAMP。

html

<form action="tutorial.php" method="POST" enctype="multipart/form-data">
    File:
    <input type="file" name="image" > <input type="submit" value="Upload">
</form>

PHP:

// connect to database
include 'include/config.php'; 

// file properties
$file = $_FILES['image']['tmp_name'];

if (!isset($file))
    echo "Please select an image.";
 else 
    $image = addslashes(file_get_contents($_FILES['image']['tmp_name']));
    $image_name = addslashes($_FILES['image']['name']);
    $image_size = getimagesize($_FILES['image']['tmp_name']);

    if ($image_size==FALSE)
        echo "This is not an image";    
    else
        if(!$insert = mysql_query("INSERT INTO gallery VALUES ('', '$image_name', '$image')"))
            die(mysql_error());
            echo "Problem uploading the image.";
        else
            $lastid = mysql_insert_id();
            echo "Image uploaded.<p />Your image:<p /><image src=include/get.php?id=$lastid>";
        
    

PHP 配置:

//database credentials
$username = "root";
$password = "root";
$hostname = "localhost"; 

//connection to the database
mysql_connect($hostname, $username, $password) or die(mysql_error()); 
mysql_select_db('imandra') or die(mysql_error()); 
//echo "Connected to MySQL";

PHP 获取:

include 'config.php'; 

$id= addslashes($_REQUEST['id']);

$image = mysql_query("SELECT * FROM gallery WHERE id='$id'");
$image = mysql_fetch_assoc($image);
$image = $image['image'];

header("Content-type: image/jpeg");

echo $image;

【问题讨论】:

所以你的 upload_max_filesize 和 post_max_size 指令都是 32MB? 是的,我已经在我的 ini 文件中检查过了,那里的一切似乎都很好。我使用this 作为指导。 虽然这是一个有趣的问题,但通常认为最好的做法是将文件保存到文件系统,并将文件引用记录在数据库中。数据库并不适合存储大型二进制对象,这样做会导致无法在不处理超大文件的情况下从备份中恢复数据。 另外,对于插入查询,请考虑以下形式:INSERT INTO gallery (col1, col2) VALUES (val1, val2)。这样,如果您更改表格的格式,您就可以适应未来,并且您不必指定一个空/null 来跳过主键。 好的。这似乎是最可能的解释,最大查询大小为 1MB。同时,我将按照建议切换到使用文件系统上传 :)!我会等待明确的答案,我很好奇。感谢@halfer 的提示!也许是时候在 PDO 中自学了! 【参考方案1】:

您可能需要查看 mysql 配置文件 (my.cnf) 中的设置。

增加 max_allowed_pa​​cket 设置的大小,例如

max_allowed_packet=50M

【讨论】:

以上是关于在旧版 MySQL 驱动程序中插入 BLOB 会导致“消失”错误的主要内容,如果未能解决你的问题,请参考以下文章

Chrome Rich 通知在旧版打包应用程序中不起作用

Oracle JDBC 驱动程序未在旧版 Web 应用程序中使用 JNDI 连接到数据库

在旧版 Win32 应用程序中实现 COM 事件接收器

我的反应应用程序没有在旧版 Safari 浏览器上加载图像和某些组件。显示 SSL 错误

如何在旧版 IOS/旧版浏览器上使用 Graphql Vue Apollo?

在旧版 Android 项目上实现暗模式