如何利用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完全过滤HTML,JS,CSS等标签
Jan 16 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
合格的PHP程序员必备技能
Nov 13 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
PHP登录验证码的实现与使用方法
Jul 07 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
php日志函数error_log用法实例分析
Sep 23 PHP
你真的了解PHP中的引用符号(&)吗
May 12 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
实用函数5
2007/11/08 PHP
php 常用字符串函数总结
2008/03/15 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
js中function()使用方法
2013/12/24 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JS中Location使用详解
2015/05/12 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
layui prompt 设置允许空白提交的方法
2019/09/24 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
土木工程毕业生自荐信
2013/11/12 职场文书
毕业设计计划书
2014/01/09 职场文书
给全校老师的建议书
2014/03/13 职场文书
求职意向书范文
2014/04/01 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
团员年度个人总结
2015/02/26 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Python还能这么玩之用Python修改了班花的开机密码
2021/06/04 Python