如何使file_get_contents返回唯一的结果



我是 php 的新手,想请您帮助从 file_get_contents(( 返回唯一结果。原因是我想给每张照片一个唯一的名称,以便以后可以只删除其中一张而不是全部。

$file =addslashes(file_get_contents($_FILES['image']['tmp_name'][$key]));

不幸的是,time(( 和 microtime(( 在这种情况下没有帮助。

也许这会帮助你: http://php.net/manual/en/function.uniqid.php

uniqid((;

$imageName = $imageName .'_' .uniqid((;

为什么不直接生成内容的 SHA-1 并将其用作文件名(有点像git在存储库的松散对象数据库中存储对象的方式(?我通常不喜欢将 blob 插入 RDBMS 中;它有点笨拙,您必须确保 blob 字段有足够的空间来容纳您希望使用的文件大小。此外,文件系统经过优化,可以很好地处理文件。因此,在 Web 服务器具有写入访问权限的服务器上保留一个特殊目录是有意义的。然后,您将文件写入其中,并将对它们的引用存储在数据库中。下面是一个示例:

// Read the contents of the file and create a SHA-1 hash signature.
$tmpPath = $_FILES['image']['tmp_name'];
$blob = file_get_contents($tmpPath);
$name = sha1($blob) . '.img'; // e.g. b99c6e26c3775fca9918ad614b7be7fe4fd7bee3.img
// Save the file to your server somewhere.
$dstPath = "/path/to/imgdb/$name";
move_uploaded_file($tmpPath,$dstPath);
// TODO: insert reference (i.e. $name) into database somehow...

是的,研究已经破坏了SHA-1,但是如果您足够偏执,您可以轻松地编写一些保护措施(例如,检查具有相同哈希值的现有上传;内容不同,只需稍微更改/附加到名称即可更改它(。您不会通过其内容来识别后端的图像:您只需要一个唯一的名称。一旦有了它,您只需从数据库中查找它即可找出与实际图像数据对应的磁盘上的文件路径。

如果您希望图像文件非常大,则可以使用第 4 个参数限制读取内存的数量以file_get_contents()

最新更新