一般你想做的是:
确定您可以通过何种方式唯一标识一张图片 - 以不泄露信息的方式。可以说是主键。
如果您的图像的元数据恰好存储在数据库中,那么每个图像可能已经有一个唯一的键(该表中的主键;可能是一个 auto_incrementing 整数)。它也可以是字符串(或 UUID);它必须是您在向世界公开时没有问题的东西(例如:没有像birthday.jpg这样的正确文件名,没有user_john.png;理想情况下是随机值,但顺序值(如mysql SERIALs)可能是可以忍受。
创建一个新的“空”页面或路由,我们称之为/image.php
现在,在您的原始页面(还不是新的/image.php,而是您已有的页面)中,您将查询数据库以确定要显示哪些图像,并为这些图像使用唯一 ID输出类似的东西
printf('<img src="/image.php?id=%s" alt="">', $imageID);
<img> 标记将导致用户自动向新的/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 确实需要(文件系统)权限才能从这些文件中读取。