【问题标题】:How to make file_get_contents return an unique result如何使 file_get_contents 返回一个唯一的结果
【发布时间】:2017-12-12 20:56:44
【问题描述】:

我是 php 新手,想请你帮忙,从 file_get_contents() 返回一个独特的结果。原因是我想给每张照片一个唯一的名字,这样以后就可以只删除其中的一张,而不是全部。

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

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

【问题讨论】:

  • 独特的结果是什么意思?该函数只是返回文件的内容,所以如果文件没有被修改,它永远不会是唯一的。
  • The reason is I want to give each photo an unique name:- file_get_contents() 不会那样做。它会给你文件的内容
  • 谢谢,但是如何将照片存储在具有唯一名称的表列类型 longblob 中?如果我使用 varchar(具有唯一名称),我无法存储和打印照片
  • Longblob 存储文件内容,它不存储文件名。
  • 在将图像保存到文件夹并将其路径保存到db列时,在文件的$_FILES名称中添加microtime()

标签: php file-get-contents addslashes


【解决方案1】:

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

uniqid();

$imageName = $imageName 。 '_' 。 uniqid();

【讨论】:

  • 这有什么帮助?
  • 那么在你的答案里写这个,我为什么要让你在cmets中解释你的答案呢?
  • 编辑你的答案。
【解决方案2】:

为什么不只生成内容的 SHA-1 并将其用作文件名(有点像 git 如何将对象存储在存储库的 loose object database 中)?我通常不喜欢将 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...

是的,研究有broken SHA-1,但如果你足够偏执,你可以很容易地写一些防范措施(例如检查具有相同哈希的现有上传;如果内容不同,只需变异/附加到命名一点来改变它)。您不是通过内容来识别后端的图像:您只需要一个唯一的名称。一旦你有了它,你只需从数据库中查找它,找出与实际图像数据对应的磁盘上的文件路径。

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

【讨论】:

  • 谢谢!我将尝试在我的代码中实现这一点并提供反馈。看起来很不错!
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2017-12-29
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2022-08-04
相关资源
最近更新 更多