如何利用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_Flame(Version:Progress)的原代码
Oct 09 PHP
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
Mar 07 PHP
逐步提升php框架的性能
Jan 10 PHP
linux下 C语言对 php 扩展
Dec 14 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
WAMP环境中扩展oracle函数库(oci)
Jun 26 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
php判断表是否存在的方法
2015/06/18 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
用ADODB.Stream转换
2007/01/22 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
如何高效使用Python字典的方法详解
2017/08/31 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
python 实现按对象传值
2019/12/26 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
电子技术专业中专生的自我评价
2013/12/17 职场文书
迟到检讨书1000字
2014/01/15 职场文书
初中科学教学反思
2014/01/21 职场文书
九年级政治教学反思
2014/02/06 职场文书
课外活动总结范文
2014/07/09 职场文书
房屋买卖协议样本
2014/11/16 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书