zoukankan      html  css  js  c++  java
  • 运用PDO存储将图片、音频文件存入数据库

    在数据库中创建表格的时候,有一个字段为image,用来保存图片,那么其类型就是blob,关于blob,百度百科是这样描述的

    BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
    在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
    BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
    根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。
    但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。
     
    将图片或者音频等文件存入数据库的原理,特别好理解,因为它们是文件,那么就可以用函数读,然后将读出的内容保存在字符串中,然后再讲该字符串存到数据库中。
    数据库如下:
    1 create table pic(
    2       id tinyint primary key auto_increment not null,
    3       image blob not null
    4 )engine=myisam charset=utf8;

    创建一个提交文件的表单,注意,提交文件的表单(form的属性method="post"  enctype="multipart/form-data")

     1 <form action="" method="post" enctype="multipart/form-data">
     2     <input type="file" name="pic" >
     3     <input type="submit" name="submit">
     4 </form>
     5 
     6 <?php 
     7     if(!empty($_POST)){
     8         try {
     9             $pdo=new PDO("mysql:host=localhost;dbname=test","root","root");
    10             $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    11             
    12             $statement=$pdo->prepare("insert into pic values (:id,:image)");
    13 
    14             //开始读文件
    15             $fp=fopen($_FILES['pic']['tmp_name'],"rb");
    16             $content="";
    17             $content=fread($fp,filesize($_FILES['pic']['tmp_name']));
    18             fclose($fp);
    19 
    20             $statement->execute(["id"=>1,"image"=>$content]);
    21             echo "the picture has been saved
    ";
    22         } catch (PDOException $e) {
    23             echo "failed to save the picture";
    24             echo $e->getMessage();
    25         }
    26      }
    27 ?>

    可以中途输出content的内容,或者运行完成后从数据库中查看添加的内容,然而你却看不懂内容是什么,全是乱码,但是,你成功将图片保存到了数据库。

    接下来,你可以将数据库中的图片“数据”,读出来,然后再以图片的形式展示一下,看是不是已提交的那张图片,代码如下:

     1 <?php 
     2     try {
     3             $pdo=new PDO("mysql:host=localhost;dbname=test","root","root");
     4             $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
     5             $statement=$pdo->prepare("select * from pic");
     6             $statement->execute();
     7             list($id,$image)=$statement->fetch(PDO::FETCH_NUM);
     8             header("Content-Type:image/png");
     9             echo $image;
    10         } catch (PDOException $e) {
    11             echo "failed to open the picture";
    12             echo $e->getMessage();
    13         }
    14 ?>
  • 相关阅读:
    【华为云技术分享】使用keil5打开GD32F450i的MDK项目出现的问题以及J-Link无法烧录程序对应的解决方案
    【华为云技术分享】不为人知的稠密特征加入CTR预估模型的方法
    205. 判断两个字符串的模式是否相同 Isomorphic Strings
    541. 反转字符串2 Reverse String II
    插入排序,二分查找插入排序,使用二叉树的插入排序
    二分查找,求mid值的类型溢出问题
    二叉搜索树类的C#实现
    二叉搜索树,删除节点
    二叉搜索树的前驱节点和后继节点
    438. 匹配字符串(顺序不同但个数相同的字符串) Find All Anagrams in a String
  • 原文地址:https://www.cnblogs.com/-beyond/p/7560069.html
Copyright © 2011-2022 走看看