如何利用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 feof用来识别文件末尾字符的方法
Aug 01 PHP
PHP中的strtr函数使用介绍(str_replace)
Oct 20 PHP
PHP截断标题且兼容utf8和gb2312编码
Sep 22 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
PHP中copy on write写时复制机制介绍
May 13 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
laravel dingo API返回自定义错误信息的实例
Sep 29 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
用PHP实现图象锐化代码
2007/06/14 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
2018/03/13 Python
python第三方库学习笔记
2020/02/07 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
美特斯邦威官方商城:邦购网
2016/10/13 全球购物
工业设计毕业生自荐信
2014/04/13 职场文书
詹天佑教学反思
2014/04/30 职场文书
四风查摆剖析材料
2014/10/10 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS