在旧版 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_packet 设置的大小,例如
max_allowed_packet=50M
【讨论】:
以上是关于在旧版 MySQL 驱动程序中插入 BLOB 会导致“消失”错误的主要内容,如果未能解决你的问题,请参考以下文章
Oracle JDBC 驱动程序未在旧版 Web 应用程序中使用 JNDI 连接到数据库
我的反应应用程序没有在旧版 Safari 浏览器上加载图像和某些组件。显示 SSL 错误