• 热门专题

php上传图片提交到数据库的代码

作者:高海波  发布日期:2012-07-10 19:26:54
Tag标签:上传图片  数据库  
  • 本来打算用在mysql里保存图片的路径,图片存在文件夹里这种方法的,后来在网上查阅了一些资料,说mysql可以直接保存二进制的数据,数据类型是blob。
      我们通常在数据库中所使用的文本或整数类型的字段和需要用来保存图片的字段的不同之处就在于两者所需要保存的数据量不同。MySQL数据库使用专门的字段来保存大容量的数据,数据类型为BLOB。
      MySQL数据库为BLOB做出的定义如下:BLOB数据类型是一种大型的二进制对象,可以保存可变数量的数据。BLOB具有四种类型,分别是TINYBLOB,BLOB, MEDIUMBLOB 和LONGBLOB,区别在于各自所能够保存的最大数据长度不同。
    然后就建立数据库

     

    CREATE TABLE ccs_image (
    id int(4) unsigned NOT NULL auto_increment,
    description varchar(250) default NULL,
    bin_data longblob,
    filename varchar(50) default NULL,
    filesize varchar(50) default NULL,
    filetype varchar(50) default NULL,
    PRIMARY KEY (id)
    )
    
    

    接着是上传文件的页面,upload.php,code如下:

    Store binary data into SQL Database

     

    // 如果提交了表单,代码将被执行:
    if (isset($_POST['submit'])) {
    $form_description = $_POST['form_description'];
    $form_data_name = $_FILES['form_data']['name'];
    $form_data_size = $_FILES['form_data']['size'];
    $form_data_type = $_FILES['form_data']['type'];
    $form_data = $_FILES['form_data']['tmp_name'];
    //echo “winson”;
    // 连接到资料库
    $connect = MYSQL_CONNECT( “localhost”, “root”, “”) or die(“Unable to connect to MySQL server”);
    mysql_select_db( “test”) or die(“Unable to select database”);
    $data = addslashes(fread(fopen($form_data, “r”), filesize($form_data)));
    //echo “mysqlPicture=”.$data;
    $result=MYSQL_QUERY( “INSERT INTO ccs_image (description,bin_data,filename,filesize,filetype) VALUES (‘$form_description’,'$data’,'$form_data_name’,'$form_data_size’,'$form_data_type’)”);
    $id= mysql_insert_id();
    print “This file has the following Database ID: $id“;
    MYSQL_CLOSE();
    } else {
    // 否则显示储存新资料的表单
    ?>
    
    
     

    上文中的$_FILES['form_data']['name']; 等是获取刚上传来的文件的信息,php manual中有提到
    注: 要确保文件上传表单的属性是 enctype=”multipart/form-data”,否则文件上传不了。
    全局变量 自 PHP 4.1.0 起存在(在更早的版本中用 $HTTP_POST_FILES 替代)。此数组包含有所有上传的文件信息。
    以上范例中 数组的内容如下所示。我们假设文件上传字段的名称如上例所示,为 userfile。名称可随意命名。
    $_FILES['userfile']['name']
    客户端机器文件的原名称。
    www.it165.net$_FILES['userfile']['type']
    文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。
    $_FILES['userfile']['size']
    已上传文件的大小,单位为字节。
    $_FILES['userfile']['tmp_name']
    文件被上传后在服务端储存的临时文件名。
    $_FILES['userfile']['error']
    和该文件上传相关的。此项目是在 PHP 4.2.0 版本中增加的。
    写上面代码时有个小波折,$data = addslashes(fread(fopen($form_data, “r”), filesize($form_data)));这句代码是从网上找到的,我查了一下addslashes()的用法,php manual上提到
    默认情况下,PHP 指令 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 进行检测。
    我以为 已经on了,所以再把这个函数去掉,结果得不到数据,写不进库里,百思得其解,也许人家就是要双层转义的效果,我不加就刚好反了,我实在不懂图片的编码方面的知识。加上这个函数,果然得到想要的结果,高兴。
     然后是显示图片,getdata.php,code如下
    <?php 
    if(isset($_GET['id'])) { 
    $id = $_GET['id'];
    $connect = MYSQL_CONNECT( “localhost”, “root”, “”) or die(“Unable to connect to MySQL server”);
    mysql_select_db( “test”) or die(“Unable to select database”);
    $query = “select bin_data,filetype from ccs_image where id=$id”; 
    $result = @MYSQL_QUERY($query); 
    $data = @MYSQL_RESULT($result,0, “bin_data”); 
    $type = @MYSQL_RESULT($result,0, “filetype”); 
    Header( “Content-type: $type”); 
    echo $data; 
    }
    ?>
    这样就算完成了,但这样只是显示单张图片,想显示多张行不行,答案是肯定的。
    编写两个文件。其中,第一个文件作为HTML页面的模板,定位图片的显示位置。第二个文件则被用来从数据库中实际输出文件流,作为<IMG>标签的SRC属性。其实第二个文件就是getdata.php。第一个文件的代码如下:
     <HTML>
     <BODY>
     <?php
    $connect = MYSQL_CONNECT( “localhost”, “root”, “”) or die(“Unable to connect to MySQL server”);
    mysql_select_db( “test”) or die(“Unable to select database”);
    $result=mysql_query(“SELECT * FROM ccs_image”) or die(“Can’t Perform Query”);
    While ($row=mysql_fetch_object($result)){
    echo  “<img src=\”show.php?id=”.$row->Id.”\”>winson<br>”;
    }
    ?>
    </BODY>
    </HTML>
    
    

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规