PHP上传图片的路径保存在数据库中,根据图片路径显示图片

鉴于上一篇《PHP上传图片到数据库并可以进行显示》链接描述有笔友提出了改进意见,下面这篇文章就是采纳改进意见进行修改的另外一种方案。

1、创建数据表

CREATE TABLE image(
id int(4) unsigned NOT NULL AUTO_INCREMENT,
name varchar(100) default NULL,
path varchar(100) default NULL,
time timestamp    default CURRENT_TIMESTAMP,
PRIMARY KEY(id)
)engine=myisam DEFAULT charset=utf8

2、新建一个uploads文件夹
uploads文件夹下面新建一个images文件夹(用来存放上传后的图片的文件夹)
,创建index.php(用于点击选择文件后提交的页面),upimage.php(实现图片上传的代码存放),getimage.php(实现图片显示的代码存放)
图片描述

3、用于点击选择文件后提交页面的index.php

<!doctype html>
<html>
 <head>
  <meta charset="UTF-8">
  <title>图片上传和下载</title>
 </head>
 <body>
<center>
<h2>文件上传</h2>
<!-- 文件上传得form表单 -->
<form action="upimage.php" method="post" enctype="multipart/form-data">
上传图片:
<input type="file" name="pic">
<input type="submit" value="上传">
</form>
</center>
 </body>
</html>

3、实现图片上传的代码存放

<?php
    //1.获取上传文件信息
    $upfile=$_FILES["pic"];
    //定义允许的类型
    $typelist=array("image/jpeg","image/jpg","image/png","image/gif");
    $path="./images/";//定义一个上传后的目录
    //2.过滤上传文件的错误号
    if($upfile["error"]>0){
        switch($upfile['error']){//获取错误信息
            case 1:
                $info="上传得文件超过了 php.ini中upload_max_filesize 选项中的最大值.";
                break;
            case 2:
                $info="上传文件大小超过了html中MAX_FILE_SIZE 选项中的最大值.";
                break;
            case 3:
                $info="文件只有部分被上传";
                break;
            case 4:
                $info="没有文件被上传.";
                break;
            case 5:
                $info="找不到临时文件夹.";
                break;
            case 6:
                $info="文件写入失败!";break;
        }die("上传文件错误,原因:".$info);
    }
    //3.本次上传文件大小的过滤(自己选择)
    if($upfile['size']>100000){
        die("上传文件大小超出限制");
    }
    //4.类型过滤
    if(!in_array($upfile["type"],$typelist)){
        die("上传文件类型非法!".$upfile["type"]);
    }
    //5.上传后的文件名定义(随机获取一个文件名)
    $fileinfo=pathinfo($upfile["name"]);//解析上传文件名字
    do{ 
        $newfile=date("YmdHis").rand(1000,9999).".".$fileinfo["extension"];
    }while(file_exists($path.$newfile));
    //6.执行文件上传
    //判断是否是一个上传的文件
    if(is_uploaded_file($upfile["tmp_name"])){
            //执行文件上传(移动上传文件)
            if(move_uploaded_file($upfile["tmp_name"],$path.$newfile)){
                echo "文件上传成功!";

                //将文件名和路径存储到数据库
                $dbms = 'mysql'; //数据库类型
                $host = 'localhost';  //数据库主机名
                $dbName = 'smart_lock';  // 使用的数据库
                $user = 'root';  //数据库连接用户名
                $pass = '123456'; //对应的密码
                $dsn ="mysql:host = $host;dbname=$dbName";
                $pdo = new PDO($dsn,$user,$pass);
                $data = addslashes(fread(fopen($pic,"r"),filesize($pic)));
                //将图片的名称和路径存入数据库
                $query = "INSERT INTO image(name,path)VALUES('$newfile','$path$newfile')";
                $result = $pdo -> query($query);

                if($result){
                    echo"文件已存储到数据库";
                }
                else{
                    echo"请求失败,请重试";
                }
            }else{
            die("上传文件失败!");
        }
    }else{
    die("不是一个上传文件!");
  }
?>

4、实现图片显示的getimage.php

<?php
    //$id = isset($_GET['id'])?intval($_GET['id']):1;
    //$id = $_GET['id'];
    $id = 2;    //id正常应该是通过用户填入的id获取(客户端发送过来的查询数据id)
    $dbms = 'mysql'; //数据库类型
    $host = 'localhost';  //数据库主机名
    $dbName = 'smart_lock';  // 使用的数据库
    $user = 'root';  //数据库连接用户名
    $pass = '123456'; //对应的密码

    $dsn = "mysql:host = $host;dbname=$dbName";
    $pdo = new PDO($dsn,$user,$pass);
    $query = "select name,path from image where id=$id";
    
    //数据查询
    $result = $pdo->query($query);
    if($result){
        $result = $result->fetchAll(2);
         echo "<img src=".$result[0]['path'].">";
         // $path="./uploads/";//定义一个上传后的目录
         // echo "<img src=$path".$result[0]['name'].">";
    }
    else{
        echo "Handle errors";
    }
?>

5、运行结果
(1)图片上传成功后在数据库中的存储如下
图片描述

运行getimage.php文件最终显示上传的图片如下
图片描述

最后打开images文件还可以看到上传的图片均已保存在该文件夹中。

结语:本人刚接触PHP不久,自知能力不够水平有限,该文中若存在什么不足或需改进之处还请大家多多指正。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值