Please enable java script to visit.
NOTEBOOK
HOMEPHP / MySQLJS / HTMLWXappPythonC++Blender其他
PHP 将图片/文件以二进制的方式储存到 MySQL 中 - NOTEBOOK
PHP 将图片/文件以二进制的方式储存到 MySQL 中
PHP / MySQL
Posted on 2022-12-24
摘要 : PHP 将图片以二进制的方式储存到 MySQL 中,并读取后提供图片显示或下载链接
例如<img src="data:image/png;base64,....."/>
获得本地文件的 MIME 的自定义函数 getFileMime($file)
❱ 优点

1、容易管理,方便做剔除重复的操作。
2、容易备份,只需要备份数据库即可。

❱ 缺点

1、不适合超大量存储,数据的存储越大,恢复越麻烦。
一般还是需要前端做更多的物理缓存,而不是靠mysql来直接输出。
2、数据库储存成本比文件储存成本高。

❱ 总结

总之,如果图片是小图片,像论坛使用的,并且需要注重他的优点的可以使用,至于量没有具体的,你要想想如果数据库遇到问题,他的重做和迁移是否方便的问题.其实如果不是特殊情况一般存在数据库里都不是好的选择.平衡他的优缺点.

❱ 如果是图片

❱ 新建数据库

注意!content 是二进制 LONGBLOB 格式。
如果是其他格式的文件,file_mime 最好设置成 100,例如 docx这样的文件,MIME可以达到71个字符。
file_name、file_size 可以去掉,不是很必要。
$sql = "CREATE TABLE file_content (
id bigint(20) NOT null AUTO_INCREMENT ,
PRIMARY KEY(id),
file_name VARCHAR(100),
file_mime VARCHAR(100),
file_size VARCHAR(100),
INDEX (file_mime),
content LONGBLOB,
create_date date,
linked VARCHAR(1)
)ENGINE=INNODB AUTO_INCREMENT=1 CHARACTER SET utf8mb4_unicode_ci ;";


❱ 插入数据

$file = './files/pic.jpg';
$img_info = getimagesize($file); // 读取文件的格式
$file_mime = $img_info['mime'];
$file_size = filesize($file); // 文件尺寸
$file_name = end(explode('/',$file));
$content = base64_encode( file_get_contents($file) ); // 转成 base64
$create_date = date('Y-m-d');
$linked = 1;
$sql = "INSERT INTO `file_content` ( `file_name`,`file_mime`,`file_size`,`content`,`create_date`,`linked` )
VALUES ('$file_name','$file_mime','$file_size', '$content' ,'$create_date','$linked') ";


❱ 读取数据并显示成图片

$id = 2;
$sql = "SELECT id,file_mime,content FROM file_content WHERE id = '$id' LIMIT 1 ;";
$sql_result = run_sql($sql);
while($row = $sql_result->fetch_assoc()){
$row = filter_getMysql($row); // 自动将一整行数据 整理成数组。
if($row['id']){
$return_result[$row['id']] = $row ;
}else{
$return_result[] = $row ;
}
}
// print_r($return_result[$id]['content']);

echo '<img src="data:'.$return_result[$id]['file_mime'].';base64,'.chunk_split($return_result[$id]['content']).'"/>';
//chunk_split 默认将每76个字符插入换行符号,免得字符串太长。


❱ 如果是文件(非图片)

❱ 获得本地文件的 MIME 自定义函数

// 获得本地文件的 MIME
function getFileMime($file){
$finfo = finfo_open(FILEINFO_MIME);
$mimetype = finfo_file($finfo, $file);
return $mimetype;
finfo_close($finfo);
}


❱ 插入数据

$file = './files/1_wxapp.zip';
$content = base64_encode( file_get_contents($file) );
$file_mime = getFileMime($file);
$file_size = filesize($file);
$file_name = end(explode('/',$file));
$create_date = date('Y-m-d');
$linked = 1;
$sql = "INSERT INTO `file_content` ( `file_name`,`file_mime`,`file_size`,`content`,`create_date`,`linked` )
VALUES ('$file_name','$file_mime','$file_size','$content' ,'$create_date','$linked') ";


❱ 读取并提供下载链接
不适用于大文件
$id = 4;
$sql = "SELECT id,file_name,file_mime,file_size,content FROM file_content WHERE id = '$id' LIMIT 1 ;";
$sql_result = run_sql($sql);
while($row = $sql_result->fetch_assoc()){
$row = filter_getMysql($row); // 自动将一整行数据 整理成数组。
if($row['id']){
$return_result[$row['id']] = $row ;
}else{
$return_result[] = $row ;
}
}
echo '<a href="data:'.$return_result[$id]['file_mime'].';base64,'.chunk_split($return_result[$id]['content']).'" download="123.zip"/>asdasdsads</a>';
//chunk_split 默认将每76个字符插入换行符号,免得字符串太长。



❱ 如果是页面直接弹出下载

$id = 4;
$sql = "SELECT id,file_name,file_mime,file_size,content FROM file_content WHERE id = '$id' LIMIT 1 ;";
$sql_result = run_sql($sql);
while($row = $sql_result->fetch_assoc()){
$row = filter_getMysql($row); // 自动将一整行数据 整理成数组。
if($row['id']){
$return_result[$row['id']] = $row ;
}else{
$return_result[] = $row ;
}
}
// 文件抬头
header('Accept-Ranges: bytes');
header('Accept-Length: ' .$return_result[$id]['file_size']);
header('Content-Transfer-Encoding: binary');
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $return_result[$id]['file_name']);
header('Content-Type: application/octet-stream; name=' . $return_result[$id]['file_name']);
echo base64_decode($return_result[$id]['content']);



常见各种 MIME 列表