【问题标题】:echo image urls from a session array从会话数组中回显图像 URL
【发布时间】:2015-09-08 10:05:22
【问题描述】:

我不想显示图片的真实 URL。所以我使用uniqueid() 来替换动态图像的URL,并将真实的URL 与uniqueid() 存储在会话中。所以我会在会话数组中得到uniqueids => real-image-path.jpg 的负载。然后使用以下代码来回显图像:

<img src="getImage2.php?h=<?php echo $uniqueID; ?>" title="" >

这一切似乎都奏效了。在getImage2.php 中,我想知道如何使用存储在会话中的变量来回显图像。我有:

session_start();
header("Content-Type: image/jpeg");
while($_SESSION[$uniqueID]){
echo readfile($_SESSION[$uniqueID]);
}

但这看起来毫无希望,显然行不通。在getImage2.php 中回显图像的最佳方式是什么?

会话数组示例如下所示:

Array ( [start] => 1435057843 
        [start_date] => 23/06/15 
        [start_time] => 12:10:43 
        [b312a3f205176aa006c8712b3aedb2a4] => images/1370322222.jpg 
        [5311d8a77e3889723a61b3768faaa4df] => images/1357323650.jpg 
        [fa14a6a315bf7ddbeb7390af23467f5e] => images/1415737586.jpg 
        [dd624079e982d78e538f873b7719f179] => images/1369865823.jpg 
        [5c4011114f6abbb9ecaf2ffbe4d3936f] => images/1369885151.jpg 
        [d26e3a017ce4851a19511fc0dfedc595] => images/1370317410.jpg
        .............

【问题讨论】:

  • 在某些情况下,您可以进行内部重定向,这样可以节省您的 PHP 服务文件的时间;另外,请查看this answer 以获得一些灵感。

标签: php


【解决方案1】:

您不想一次尝试并回显所有图像。每个&lt;img&gt; 标签都会向服务器发送一个单独的请求,以便在页面加载过程中提供特定图像,因此只需获取服务器上的 PHP 代码即可返回请求的特定图像,如下所示:-

getImage2.php 脚本

session_start();

$filename = 'images/missing_image.jpg'; // set a default

if ( isset($_GET['h']) && isset($_SESSION[ $_GET['h'] ]) ) {
    $filename = $_SESSION[ $_GET['h'] ]
}

header("Content-Type: image/jpeg");
readfile( $filename );

注意您的评论

当你使用它时

<img src="getImage2.php?h=<?php echo $uniqueID; ?>" />

会像这样写入浏览器

<img src="getImage2.php?h=b312a3f205176aa006c8712b3aedb2a4" />

$_GET 数组在 getImage2.php 收到时会如下所示。

$_GET [
         h => b312a3f205176aa006c8712b3aedb2a4
      ]

所以$_GET['h'] 将是您所称的唯一ID,您可以使用它作为$_SESSION 数组的键来寻址正确的文件路径

【讨论】:

  • 不只是 'h' 只是 uniqueID()。真实图像路径包含在会话中,为 uniqueID =>real-image-path.jpeg。所以死了 $_SESSION[$_GET['h']] = 真实图像路径?
  • 查看我的注释以回复您的评论
  • 感谢您的帮助,很抱歉在这里很密集。如何获得 = 到 uniqueID() 的真实图像路径?是否行 readfile($_SESSION['GET['h']]);查看当前会话,找到uniqueID的值(取自img源),然后回显真实的图片路径?
  • 是的,假设我对您如何构建 $_SESSION 数组数据做出了所有正确的假设。执行print_r($_SESSION) 并编辑您的问题并添加该输出的示例,以便我可以看到您的 $_SESSION 实际是什么样子
  • 感谢 RiggsFolly。已使用会话数组示例编辑问题。
【解决方案2】:

您不应在此处使用 while 循环或 readfile。相反,试试这个:

session_start();
header("Content-Type: image/jpeg");
echo file_get_contents($_SESSION['$uniqueID']);

我假设您尝试一次输出一张图像。

【讨论】:

  • 想要在主页上显示所有图像,但从 getImage2.php 获取真实的 url。我不需要在 getImage2.php 上显示所有图像吗?另外 - file_get_contents 不是比 readfile() 更占用内存吗?
  • 正如@RiggsFolly 提到的,您主页上的每个img 标签都会向getImage2.php 发送一个图像请求,因此您一次只需要输出一个。使用 readfile 也很好,只是不像你的问题那样循环。
【解决方案3】:

这应该会让你走上正确的道路:

session_start();
// get passed 'h' parameter and look it up in the session
$handle = isset($_GET['h']) ? $_GET['h'] : null;
$image = isset($_SESSION[$handle]) ? $_SESSION[$handle] : null;

if (file_exists($image) {
    // the file can be found
    header('Content-Type: image/jpeg');
    header('Content-Length: ' . filesize($image));

    session_abort(); // close session without changes
    readfile($image);
} else {
    // file was not found
    if ($image !== null) {
        // we should invalidate the session
        unset($_SESSION[$handle]);
    }
    header('HTTP/1.0 404 Not found');
}

不过,通常更好的方法是使用 X-Sendfile 或 X-accel 标头;您可以从我的older answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多