如何利用php+mysql保存和输出文件

5年以前  |  阅读数:259 次  |  编程语言:PHP 

本地文件上传到服务器后,服务器的脚本对文件进行保存,一般有两种方式,一种是作为
文件保存到机器的特定目录下,但是这里就有很多诸如文件重名带来的种种不便之处,有的程
序自动改文件名字,把名字加上上传时间等方法以保证文件名的唯一性,这样失去了文件的原
始名字,通过文件名查询特定的文件信息也有很多困难,不利于文件的统一管理;一种是把文
件保存到数据库中利用数据库的强大功能,可以方便的实现文件的各种操作。本文采用的是第
二种方法。

这一组程序演示了,如何将硬盘的一个文件通过网页,上传到服务器的数据库里面,并且   

读出文件的内容。

使用说明:
一共有5个程序,说明如下:
1. file.sql --- 本程序要用到的数据库表的结构[注:数据库用的是test]
2. upload.php --- 上传表单
3. submit.php --- 上传处理程序
4. show_info.php --- 显示部分上传的文件信息
5. show_add.php --- 显示[下载]文件

//////////////////////////////////////////////////////////////////////
(1)file.sql ---
//简要说明
保存上传得文件的基本信息的数据库结构,此处注意保存文件内容的字段,使用longtext类型
因为普通的blob类型最大存储64K字节。另外,一般php的默认配置最大上传文件为2M,如果上
传的文件特别大,莫忘了调整php.ini的设置哦。
//文件源码
create table receive(
id int NOT NULL auto_increment, #主键,自动累加
file_data longblob, #文件内容
file_type varchar(100), #文件类型
file_name varchar(255), #文件名字
file_size int, #文件大小
PRIMARY KEY(id) #主键
)

//////////////////////////////////////////////////////////////////////
(2)upload.php ---
//简要说明
上传界面,用户选择文件,然后提交给submit.php处理
值得注意的是一个 MAX_FILE_SIZE的隐藏值域,通过设置其VALUE可
以限制上载文件的大小。
//程序源码

文件上传表单
选择上传文件

//////////////////////////////////////////////////////////////////////
(3)submit.php ---
//简要说明
把用户上传得文件连同文件的基本信息保存到数据库里
//程序源码
<?php
if($myfile != "none" && $myfile != "") { //有了上传文件了

    //设置超时限制时间,缺省时间为 30秒,设置为0时为不限时   
    $time_limit=60;            
    set_time_limit($time_limit); //   

    //把文件内容读到字符串中   
    $fp=fopen($myfile,  "rb");   
    if(!$fp) die("file open error");   
    $file_data = addslashes(fread($fp, filesize($myfile)));   
    fclose($fp);   
    unlink($myfile);    

    //文件格式,名字,大小   
    $file_type=$myfile_type;   
    $file_name=$myfile_name;   
    $file_size=$myfile_size;   

    //连接数据库,把文件存到数据库中   
    $conn=mysql_connect("127.0.0.1","***","***");   
    if(!$conn) die("error : mysql connect failed");   
    mysql_select_db("test",$conn);   

    $sql="insert into receive    
    (file_data,file_type,file_name,file_size)    
    values ('$file_data','$file_type','$file_name',$file_size)";   
    $result=mysql_query($sql);   

    //下面这句取出了刚才的insert语句的id   
    $id=mysql_insert_id();   

    mysql_close($conn);   

    set_time_limit(30); //恢复缺省超时设置    

    echo "上传成功--- ";   
    echo "<a href='show_info.php?id=$id'>显示上传文件信息</a>";   
}     
else {     
    echo "你没有上传任何文件";     
}     

?>

//////////////////////////////////////////////////////////////////////
(4)show_info.php ---
//简要说明
从数据库里取出文件的基本信息[文件名和文件大小]。
//程序源码
<?php
if(!isset($id) or $id=="") die("error: id none");

//定位记录,读出   
$conn=mysql_connect("127.0.0.1","***","***");   
if(!$conn) die("error: mysql connect failed");   
mysql_select_db("test",$conn);   

$sql =  "select file_name ,file_size from receive where id=$id";   
$result = mysql_query($sql);   
if(!$result) die(" error: mysql query");   

//如果没有指定的记录,则报错   
$num=mysql_num_rows($result);   
if($num<1) die("error: no this recorder");   

//下面两句程序也可以这么写   
//$row=mysql_fetch_object($result);   
//$name=$row->name;   
//$size=$row->size;   
$name = mysql_result($result,0,"file_name");   
$size = mysql_result($result,0,"file_size");   

mysql_close($conn);   

echo "<hr>上传的文件的信息:";   
echo "<br>The file's name - $name";     
echo "<br>The file's size - $size";    
echo "<br><a href=show_add.php?id=$id>附件</a>";   

?>

//////////////////////////////////////////////////////////////////////
(5)show_add.php ---
//简要说明
从数据库里取出文件内容
//程序源码
<?php
if(!isset($id) or $id=="") die("error: id none");

//定位记录,读出   
$conn=mysql_connect("127.0.0.1","***","***");   
if(!$conn) die("error : mysql connect failed");   
mysql_select_db("test",$conn);   
$sql    =  "select * from receive where id=$id";   
$result =  mysql_query($sql);   
if(!$result) die("error: mysql query");   

$num=mysql_num_rows($result);   
if($num<1) die("error: no this recorder");   

$data = mysql_result($result,0,"file_data");   
$type = mysql_result($result,0,"file_type");   
$name = mysql_result($result,0,"file_name");   

mysql_close($conn);   

//先输出相应的文件头,并且恢复原来的文件名   
header("Content-type:$type");   
header("Content-Disposition: attachment; filename=$name");   
echo $data;   

?>

本程序在 win2000 pro + apache 1.13.19 + php 4.0.5 + mysql 3.23.36 下通过。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例