PHP脚本标题类型图像会破坏会话

时间:2012-12-22 23:40:54

标签: php image session request

我正在尝试编写一个小型PHP脚本,该脚本使用会话来存储图像的文件夹结构。每次调用一方时,它会从会话列表中读取下一个图像并将其显示为该方的内容类型。当我调用我的脚本时,我有时不会将下一个图像从列表中删除,而是下一个图像。当我写一个输出文件来注册每个页面请求时,我发现只有一个请求。但是,如果我查看我的火灾时间线,我看不到多个请求,并且没有运行javascript。如果我将图像显示为普通HTML页面的一部分,一切都会发挥作用。那么这里发生了什么。

如果有人可以帮我解决这个问题会很好......

<?php
include("readDir.class.php");

define("IMAGE_SOURCE_PATH","img");

session_start();

//Inititalize new session context
try
{
    if(!isset($_SESSION['id']))
        initSessionConext();
}
catch (Exception $e) 
{
    exit();
}

$fotos = $_SESSION['fotos'];

//Handle wrapp around
try
{
    if($_SESSION['id'] >= count($fotos))
        initSessionConext();
}
catch (Exception $e) 
{
    exit();
}
$foto = $fotos[$_SESSION['id']];
if(strcasecmp($_SERVER['REQUEST_METHOD'],"get") == 0)
     $_SESSION['id'] += 1;

//Error in session context return nothing
if(empty($foto))
    exit(); //

switch(readDir::extension($foto))
{
    case "png":
        header('Content-Type: image/png');
        break;
    case "jpg": //Fall through to jpeg case
    case "jpeg":
        header('Content-Type: image/jpeg');
        break;
}

$fp = fopen("test.txt","a");
fwrite($fp,$foto."\r\n");
fclose($fp);

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
readfile(IMAGE_SOURCE_PATH."/".$foto);

//echo $foto."<br>";
//echo '<img src="'.IMAGE_SOURCE_PATH."/".$foto.'" />';

//--------------- F U N C T I O N S -------------------------------

function initSessionConext()
{
    $_SESSION['id'] = 0;
    $_SESSION['fotos'] = getNewData(IMAGE_SOURCE_PATH);
}

function getNewData($path)
{
    $extensions = array("jpg","png","jpeg");        //get data out of file system
    $fotos = array();
    $source = new readDir($path);
    if(!$source->check())
         throw new Exception('Could not find source for given path');
    $fotos = $source -> readFilesWithextension($extensions);
    if(!sort($fotos,SORT_STRING))
         throw new Exception('Could not sort foto list in natural order');
    return $fotos;
}
?> 

2 个答案:

答案 0 :(得分:2)

因此,如果我理解正确,您每次都会返回图像,每次加载一张图像?

我觉得浏览器有两次请求图像:一次是HEAD请求,第二次是获取内容。这通常用于在盲目下载之前找出Content-Length标题之类的内容。

我建议在修改会话之前确保strcasecmp($_SERVER['REQUEST_METHOD'],"get") == 0

答案 1 :(得分:0)

至少没有解决请求问题。现在使用时差来区分请求。不太好,但开箱即用...