如何利用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 清除网页病毒的方法
Dec 05 PHP
批量去除PHP文件中bom的PHP代码
Mar 13 PHP
php中hashtable实现示例分享
Feb 13 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
Aug 17 PHP
iOS10推送通知开发教程
Sep 19 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
php面向对象程序设计入门教程
Jun 22 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
php 不使用js实现页面跳转
2014/02/11 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JS中confirm,alert,prompt函数区别分析
2011/01/17 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Python地图绘制实操详解
2019/03/04 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
几个Shell Script面试题
2012/08/31 面试题
餐饮业会计岗位职责
2013/12/19 职场文书
应届毕业生求职信范文分享
2013/12/26 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
先进学校事迹材料
2014/12/30 职场文书
Nginx的rewrite模块详解
2021/03/31 Servers
利用 JavaScript 构建命令行应用
2021/11/17 Javascript
python神经网络学习 使用Keras进行简单分类
2022/05/04 Python
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers