【问题标题】:Serve images using PHP not in document root使用不在文档根目录中的 PHP 提供图像
【发布时间】:2021-12-14 11:32:39
【问题描述】:

希望你今天一切顺利。

我目前正在尝试使用不在文档根目录中的 PHP 提供图像。这需要特定于帐户,以便只有特定用户才能访问他们的图像。

我正在研究 X-Sendfile,但不知道是否有更好的方法。到目前为止,我还没有让 X-Sendfile 工作。

我本质上需要能够加载一个图像,以便它可以被 HTML 引用,

<img src="image.png" alt="">

这样。所以基本上将文件加载为 image.png 然后在 HTML 中引用它。如果有一个更好的方法,我不知道如何做到这一点,以及如何做到这一点。请帮帮我。

祝你有美好的一天。

【问题讨论】:

    标签: php html x-sendfile


    【解决方案1】:

    一般你想做的是:

    确定您可以通过何种方式唯一标识一张图片 - 以不泄露信息的方式。可以说是主键。 如果您的图像的元数据恰好存储在数据库中,那么每个图像可能已经有一个唯一的键(该表中的主键;可能是一个 auto_incrementing 整数)。它也可以是字符串(或 UUID);它必须是您在向世界公开时没有问题的东西(例如:没有像birthday.jpg这样的正确文件名,没有user_john.png;理想情况下是随机值,但顺序值(如mysql SERIALs)可能是可以忍受。


    创建一个新的“空”页面或路由,我们称之为/image.php


    现在,在您的原始页面(还不是新的/image.php,而是您已有的页面)中,您将查询数据库以确定要显示哪些图像,并为这些图像使用唯一 ID输出类似的东西

    printf('<img src="/image.php?id=%s" alt="">', $imageID);
    

    &lt;img&gt; 标记将导致用户自动向新的/image.php 页面发出附加请求,以下载图像。


    /image.php 中,您将从 $_GET['id'] 获取请求的 ID。然后您将查询数据库以查看这是否是此人应该能够访问的图像(并且也许还确定服务器上的filename 是什么)。 假设您的查询确定:

    $allowAccess = true;
    $filename    = '../imgstorage/756345343465r563523.png';
    

    现在您只需让 php 发送一些标头以将即将到来的数据识别为图像,然后将文件传递给:

    if ($allowAccess && file_exists($filename)) {
        Header("Content-Type: image/png");
        Header("Content-Length: " . filesize($filename));
        readfile($filename);
        Exit(0);
    } else die('Go away');
    

    仅此而已。


    文件可以位于任何地方;在 webroot 内部或外部(没有区别),但 PHP 确实需要(文件系统)权限才能从这些文件中读取。

    【讨论】:

    • 非常感谢!信息量很大。不过我还有一个问题。是否可以从一个 PHP 页面提供多个图像?
    • 我想到了一些东西。我可以做一个 ?GET 请求并在上面提供特定的图像。这是一种方式。我很想知道您是否可以从一页中提供 2 张具有不同文件名的图像。如果不是,我会坚持使用 GET 或 POST 请求。
    • 是的,添加任意数量的图像,每增加一个图像就添加一个printf('&lt;img src="/image.php?id=%s" alt=""&gt;', $imageID);
    • 是的,您可以按照您描述的方式组合文件,这没有错;但无论哪种情况,每个&lt;img&gt; 都会产生一个额外的请求;因此,如果该页面有 4 张图片,您将获得 5 次点击(第一次点击您的 currentpage.php,然后每次点击 1x 至 /image.php
    • 如果您可以从一个页面中提供 2 张具有不同文件名的图像 -> 是的,这就是唯一标识符很重要的原因,所以image.php 知道要提供哪个图像.
    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多