如何利用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 相关文章推荐
smarty静态实验表明,网络上是错的~呵呵
Nov 25 PHP
PHP和XSS跨站攻击的防范
Apr 17 PHP
php笔记之常用文件操作
Oct 12 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
php使用标签替换的方式生成静态页面
May 21 PHP
Thinkphp无限级分类代码
Nov 11 PHP
WordPress的主题编写中获取头部模板和底部模板
Dec 28 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
PHP 网站修改默认访问文件的nginx配置
May 27 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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
PHP的历史和优缺点
2006/10/09 PHP
信用卡效验程序
2006/10/09 PHP
php mssql 数据库分页SQL语句
2008/12/16 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
vue 中自定义指令改变data中的值
2017/06/02 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
Python 异常处理实例详解
2014/03/12 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
美国校服网上商店:French Toast
2019/10/08 全球购物
为什么需要版本控制
2016/10/28 面试题
新闻记者实习自我鉴定
2013/09/19 职场文书
人力资源专员自我评价怎么写
2013/09/19 职场文书
小学生防溺水广播稿
2014/01/12 职场文书
委托书样本
2014/04/02 职场文书
八一建军节营销活动方案
2014/08/31 职场文书
党课心得体会范文
2014/09/09 职场文书
刑事法律意见书
2015/06/04 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书