如何利用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 相关文章推荐
php getsiteurl()函数
Sep 05 PHP
php5.3 废弃函数小结
May 16 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
PHP Cookie的使用教程详解
Jun 03 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
PHP中ini_set与ini_get用法实例
Nov 04 PHP
php根据一个给定范围和步进生成数组的方法
Jun 19 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
PHP基于递归算法解决兔子生兔子问题
May 11 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
Mar 21 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 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解决DOM乱码的方法示例代码
2016/11/20 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
toString()一个会自动调用的方法
2010/02/08 Javascript
jQuery实现等比例缩放大图片让大图片自适应页面布局
2013/10/16 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
js格式化时间的方法
2015/12/18 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
zTree异步加载展开第一级节点的实现方法
2017/09/05 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
微信小程序一周时间表功能实现
2019/10/17 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python reduce()函数的用法小结
2017/11/15 Python
基于python实现在excel中读取与生成随机数写入excel中
2018/01/04 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
利用python 读写csv文件
2020/09/10 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
小学毕业典礼主持词
2014/03/27 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
关于热爱祖国的演讲稿
2014/05/04 职场文书
解除劳动合同证明书
2014/09/26 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android