PHP 数据库上传二进制图片并显示(附:个人解析)

最近为了完成作业,需要用到上传图片的功能。。。上网找了找源码,不过源码出处太多了,搞得不知道哪篇是原创。完成功能后写点自己理解,不当之处请指导

1.创建数据库、创建表

在这里插入图片描述
字段需要3个字段图片的id、图片的类型、图片的二进制数据(第四个字段是我自己的项目需要,不需加)。
其中二进制数据可选类型:

  • TinyBlob(上限255B)
  • Blob (上限65KB)
  • MediumBlob (上限16MB)
  • LongBlob (上限4GB)

2.连接数据库

在这里插入图片描述

3.整体代码photo.php

<?php
//导入数据库配置
require ('../config/conn.php');
//判断action
$action=isset($_REQUEST['action'])?$_REQUEST['action']: "";
//上传图片
if($action=="add") {
    $image = mysqli_escape_string($conn, file_get_contents($_FILES['photo']['tmp_name']));
    $type = $_FILES['photo']['type'];
    $sql="insert into avatar values (null,'".$type."','".$image."',1)";
    mysqli_query($conn,$sql);
    header('location:photo.php');
    exit();
}elseif($action=="show"){
    //显示图片
    $id=isset($_GET['id'])?intval($_GET['id']):0;
    $sql="select * from avatar where id = ".$id;
    $query=mysqli_query($conn,$sql);
    $thread=mysqli_fetch_assoc($query);
    if($thread){
        header("content-type:".$thread['type']);
        echo $thread['photoData'];
        exit();
    }
}else{
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Hello, world!</title>
</head>
<body>
<form name="form1" method="post" action="photo.php" enctype="multipart/form-data">
    <p>图片:<input type="file" name="photo" id="photo"></p>
    <p><input type="hidden" name="action" value="add"><input type="submit" name="b1" value="提交"></p>
</form>
<?php
$sql = "select * from avatar order by id desc";
$query = mysqli_query($conn, $sql);
$result = array();
while ($t = mysqli_fetch_assoc($query)) {
    $result[] = $t;
}
foreach ($result as $val) {
    echo "<p><img src='photo.php?action=show&id=".$val['id']."' style='width: 52px'></p>";
}
?>
</body>
    <?php
}
?>

4.解析

4.1 为了便于理解先从html部分开始
//注意:有关文件上传的表单必须使用post方法,并且必须添加属性enctype="multipart/form-data"
<form name="form1" method="post" action="photo.php" enctype="multipart/form-data">
	//必须要有name和id属性
    <p>图片:<input type="file" name="photo" id="photo"></p>
    //hidden类型的input控件是为了在表单上传后传递action的值,当PHP代码判定action="add"时上传图片
    <p><input type="hidden" name="action" value="add"><input type="submit" name="b1" value="提交"></p>
</form>

效果图:
在这里插入图片描述

4.2html中的php部分
//从表中查询记录,若有则输出图片
<?php
$sql = "select * from avatar order by id desc";
$query = mysqli_query($conn, $sql);
$result = array();
while ($t = mysqli_fetch_assoc($query)) {
    $result[] = $t;
}
foreach ($result as $val) {
	//img标签中的src需要的是图片地址;
	//连接到photo.php (即本页文件),并传递action的值和图片id,,,设置图片宽度可以等宽缩放
    echo "<p><img src='photo.php?action=show&id=".$val['id']."' style='width: 52px'></p>";
}
?>
4.3当我上传图片后点击提交
//获取到action的值为add
$action=isset($_REQUEST['action'])?$_REQUEST['action']: "";
//上传图片
if($action=="add") {
	//$FILES['photo']['tmp_name']获取到上传的图片的临时文件名
	//file_get_contents() 把整个文件读入一个字符串中。
	//mysqli_escape_string()将字符串进行转义,不过为什么要数据库的属性$conn呢?
	//我觉的可能是要获取数据库的字符集或编码格式吧、具体是啥我也不知道
    $image = mysqli_escape_string($conn, file_get_contents($_FILES['photo']['tmp_name']));
    //获取图片格式
    $type = $_FILES['photo']['type'];
    $sql="insert into avatar values (null,'".$type."','".$image."',1)";
    mysqli_query($conn,$sql);
    //插入图片和跳回本页;注意:跳转后没有传入action
    header('location:photo.php');
    exit();
}
4.4当数据库里有记录时

这是html部分img标签所连接到的内容,只有这一部分(到这一部分我当时没理解过来)

}elseif($action=="show"){
    //显示图片
    //获取在html部分传入的图片id
    $id=isset($_GET['id'])?intval($_GET['id']):0;
    $sql="select * from avatar where id = ".$id;
    $query=mysqli_query($conn,$sql);
    $thread=mysqli_fetch_assoc($query);
    if($thread){
    	//设置内容类型
        header("content-type:".$thread['type']);
        //输出图片的二进制内容
        echo $thread['photoData'];
        exit();
    }
}else{

想要具体感受可以从数据库下载图片数据,将后缀改成图片格式
这一部分不能有其他任何输出,所以前后都是else,后面的else包住所有的html部分

5.到这就能看效果啦

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值