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