缓存并显示图像php

时间:2018-03-10 18:53:05

标签: javascript php caching

我使用php脚本在我的数据库中显示存储为blob的图像。

我曾经用以下脚本显示它们。

<?php

if(!empty($_GET['user_id'])){//script to display an image from the database you basicly just get the id from the picture in matter and fucking acess it
include_once "DBH.php";
//Get image data from database

$id = mysqli_real_escape_string($conn, $_GET['user_id']);
$result = $conn->query("SELECT image FROM profilePictures WHERE user_id = $id");
if($result->num_rows > 0){
    $imgData = $result->fetch_assoc();
    header("Content-type: image"); 
    echo $imgData['image']; 
}else{
    echo 'Image not found...';
}
}
?>

的上下文中
<img src = 'displayProfilePicture.php?user_id=n'>

包含div的div经常更新,并且更新用户图像似乎有很多不必要的处理。我想在网页中缓存profilepictures,这样我就不必每次都从数据库中查询它们。我开始阅读很多关于如何缓存图像但无法找到有关如何显示缓存图像的任何内容。

这对我来说是一个问题,因为每次使用php脚本更新img时,图像会闪烁一些。在一个最佳的世界中,我看到img加载了一次,之后它就不必加载了。

我使用display img脚本的上下文是在ajax-request中使用timer-interval更新的聊天中      $( “#chatlogs”)负载( “logs.php”);

 logs.php

 if(isset($_SESSION['chatRoomId'])){
 while ($extract = mysqli_fetch_array($result1))
 {
   $from = $extract['from'];

   //make an object to echo.
   if($from == $id){
   echo "<div class='chatContainer self'>
    <div class = 'imgContainer'>
     <img src='displayProfilePicture.php?user_id=$selfId'>
    </div>
   <div class='content'>
    <div class = 'message'>
        ". $extract['msg'] ."
    </div>
</div>
</div>";
}else{
echo "<div class='chatContainer friend'>
<div class = 'imgContainer'>
  <img src='displayProfilePicture.php?user_id=$guestId'>
</div>
<div class='content'>
    <div class = 'message'>
        ". $extract['msg'] ."
    </div>
</div>
</div>";
}
}
}

1 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西:

<?php

if(empty($_GET['user_id']) || !preg_match( '/^[0-9]+$/' , $_GET['user_id'])){
    header( '400 Bad Request' );
    exit(1);
}

include_once "DBH.php";


$user_id = intval( $_GET['user_id'] );

$result = $conn->query("SELECT image FROM profilePictures WHERE user_id = $user_id");
if($result->num_rows == 0){
    // Not Found
    header('404 Not Found');
    exit(1);
}

$imgData = $result->fetch_assoc();
header("Content-type: image"); 
$cache_for = 3600; // One hour in seconds 
$cache_until = gmdate("D, d M Y H:i:s", time() + $cache_for) . " GMT";
header("Expires: $cache_until");
header("Pragma: cache");
header("Cache-Control: max-age=$cache_for");
echo $imgData['image'];
exit(0);

<强>评论

首先,我检查了请求中是否提供了user_id,如果是,请检查它是否为有效数字,如果它没有响应400错误。

我还在代码src='displayProfilePicture.php?user_id=-1 or 1=1中删除了一个SQLi。

我已经设置了缓存标头,因此浏览器会将图像缓存一小时。