php + mysql 取得数据库中二进制文件,生成链接供打开
答案:3 悬赏:80 手机版
解决时间 2021-04-06 18:27
- 提问者网友:相思似海深
- 2021-04-06 12:49
php + mysql 取得数据库中二进制文件,生成链接供打开
最佳答案
- 五星知识达人网友:空山清雨
- 2021-04-06 14:09
filelist.php
................
$result=mysql_db_query(.........id,filename.........);#查询结果并存入变量中
$rows=mysql_num_rows($result);#得出数据行数
for($i=0;$i<$rows;$i++){
$total=mysql_fetch_array($result);
echo "$total[filename]";
}
...............
?>
filedown.php
$fid=$_GET['fileid'];
$fname=$_GET['filename'];
.....................
.....................
$result=mysql_db_query(.........,"select id,filename,datasize,filedata from ftable where id='$fid'",.........);
$total=mysql_fetch_array($result);
$file_size=$total[datasize];
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Accept-Length:$file_size");
header("Content-Disposition:attachment;filename=".$total[filename]);
echo $total[filedata];
...............
?>
======
你说把二进制的字节流取出生成文件保存到磁盘然后给个超链接, 这样做法没意义,你既然把它存在库里了那直接stream给用户是最好的方式,否则你还得考虑把它还原到文件夹用户使用完后怎么处理的问题?如果保留那当初就应该同时把它存在文件夹省得者多麻烦,如果不保留那反复生成删除还有共享问题反而加重服务器负担。要么一次生成定期择优删除,又有许多代码有的写了。。。
................
$result=mysql_db_query(.........id,filename.........);#查询结果并存入变量中
$rows=mysql_num_rows($result);#得出数据行数
for($i=0;$i<$rows;$i++){
$total=mysql_fetch_array($result);
echo "$total[filename]";
}
...............
?>
filedown.php
$fid=$_GET['fileid'];
$fname=$_GET['filename'];
.....................
.....................
$result=mysql_db_query(.........,"select id,filename,datasize,filedata from ftable where id='$fid'",.........);
$total=mysql_fetch_array($result);
$file_size=$total[datasize];
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Accept-Length:$file_size");
header("Content-Disposition:attachment;filename=".$total[filename]);
echo $total[filedata];
...............
?>
======
你说把二进制的字节流取出生成文件保存到磁盘然后给个超链接, 这样做法没意义,你既然把它存在库里了那直接stream给用户是最好的方式,否则你还得考虑把它还原到文件夹用户使用完后怎么处理的问题?如果保留那当初就应该同时把它存在文件夹省得者多麻烦,如果不保留那反复生成删除还有共享问题反而加重服务器负担。要么一次生成定期择优删除,又有许多代码有的写了。。。
全部回答
- 1楼网友:佘樂
- 2021-04-06 16:14
1.附件存在数据库中确实让人感到蛋疼。考虑到你的项目情况,你为什么不用存到文件系统中的方式?然后数据库中只存在一个KEY?这样既减少了数据库的开销,又提高了性能。
比如你的DATA目录是:/data/htdocs/xxx/attachment/yyy/
xxx网站根目录,YYY可能为你ATTACHEMENT的一个HASH值。比如 你可能支持10000个以上附件,那么你可能建立20个目录,每个目录最多可以存500个文件。毕竟把所有的数据放在一个目录中是很不友好的。
你的文件名字为:aaa.jpg
全路径:/data/htdocs/xxx/attachment/2/aaa.jpg
这个时候 我建议你的数据库这样建立
create table pic_info
{
picId unsigned int not null autoincrement comments 'pic id',
dirId int not null comments '附件所在目录Id,也就是上面所说的yyy',
filename varchar(64) not null,
primary key(picId),
key(dirId)
}engine=innnodb charset=utf8;
url生成按照拼接的方式来做.你可以指定一个URL方式做为专属的下载URL,比如
http:://domain/filedownload/download.php?to=picId&dirId=dirId&=filename=a.jpeg
通过DOWNLOAD.PHP 你可以做一些权限认证啥的 ,然后再DOWNLOADPHP里面实现文件下载的功能:
也就是重写header-->fileopen->echo。
另外也许你需要在数据库中指明数据类型。
比如你的DATA目录是:/data/htdocs/xxx/attachment/yyy/
xxx网站根目录,YYY可能为你ATTACHEMENT的一个HASH值。比如 你可能支持10000个以上附件,那么你可能建立20个目录,每个目录最多可以存500个文件。毕竟把所有的数据放在一个目录中是很不友好的。
你的文件名字为:aaa.jpg
全路径:/data/htdocs/xxx/attachment/2/aaa.jpg
这个时候 我建议你的数据库这样建立
create table pic_info
{
picId unsigned int not null autoincrement comments 'pic id',
dirId int not null comments '附件所在目录Id,也就是上面所说的yyy',
filename varchar(64) not null,
primary key(picId),
key(dirId)
}engine=innnodb charset=utf8;
url生成按照拼接的方式来做.你可以指定一个URL方式做为专属的下载URL,比如
http:://domain/filedownload/download.php?to=picId&dirId=dirId&=filename=a.jpeg
通过DOWNLOAD.PHP 你可以做一些权限认证啥的 ,然后再DOWNLOADPHP里面实现文件下载的功能:
也就是重写header-->fileopen->echo。
另外也许你需要在数据库中指明数据类型。
- 2楼网友:山河有幸埋战骨
- 2021-04-06 15:17
存路径呀,干嘛直接存数据
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯