我将图片上传到公共'uploads'文件夹,将文件重命名为MySQL表格中文件条目的ID。因此,由于ID按递增顺序排列,任何人都可以下载/查看图像(其中一些图像应该只能由某些特定人员访问)。但我不希望任何人通过输入URL来访问这些文件。
一种方法是将图像上传到公共目录以外的其他位置,然后在PHP脚本中使用每个图像的base64代码进行输出。但这会增加页面加载时间。
这个问题的替代方案是什么?一种方法是使用crypt()函数生成哈希并重命名文件,将文件名存储在表中。
答案 0 :(得分:3)
哈希选项可能是最好的。将图像存储在文档根目录外的DB ID中,以防止直接访问。然后你的图像查看脚本会有类似的东西:
<?php
$hash = $_GET['id'];
$info = get_image_metadata_from_database($hash); // look up ID, mime type, etc..
if ($info === false) {
readfile('/path/to/image/with/errortext.jpg'); // invalid hash, non-existent img, etc...
}
header('Content-type: ' . $info['mime']);
readfile('/path/to/image/storage/ . $info['filename']);
由于此脚本可能会被用作<img>
标记的目标,因此您无法输出无效哈希值的标准错误消息 - 它只会显示为已损坏的图像客户,因此输出标准&#34; oops,出错了&#34;而不是图片。