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


Posted in PHP onOctober 09, 2006

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

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

使用说明:
一共有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可  
以限制上载文件的大小。
//程序源码
<html>   
<head>   
<title>文件上传表单</title>   
</head>   
<body>   
<table>   
<form enctype='multipart/form-data' name='myform' action='submit.php'  
method='post'>   
<INPUT TYPE = "hidden" NAME = "MAX_FILE_SIZE" VALUE ="1000000">
<tr><td>选择上传文件</td><td>
<input name='myfile' type='file'></td></tr>  
<tr><td colspan='2'><input name='submit' value='上传'   
type='submit'></td></tr>   
</table>   
</body>   
</html>

//////////////////////////////////////////////////////////////////////
(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 相关文章推荐
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
Mar 29 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
paypal即时到账php实现代码
Nov 28 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
解决file_get_contents无法请求https连接的方法
Dec 17 PHP
PHP中文编码小技巧
Dec 25 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
Nov 23 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
消息持续发送的完整例子
Oct 09 #PHP
PHP+MYSQL的文章管理系统(一)
Oct 09 #PHP
PHP实现分页的一个示例
Oct 09 #PHP
用cookies来跟踪识别用户
Oct 09 #PHP
使用sockets:从新闻组中获取文章(一)
Oct 09 #PHP
使用sockets:从新闻组中获取文章(三)
Oct 09 #PHP
PHP+MYSQL的文章管理系统(二)
Oct 09 #PHP
You might like
用文本作数据处理
2006/10/09 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
Javascript模板技术
2007/04/27 Javascript
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Django验证码的生成与使用示例
2017/05/20 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
在python中logger setlevel没有生效的解决
2020/02/21 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
护士实习生自我鉴定范文
2013/12/10 职场文书
教师实习自我鉴定
2013/12/11 职场文书
商场主管竞聘书
2014/03/31 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
国防教育标语
2014/10/08 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
Redis Lua脚本实现ip限流示例
2022/07/15 Redis