【发布时间】: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 中自学了!
标签: php html mysql css file-upload