如何为上传的照片生成短文件名?

时间:2010-02-25 09:18:14

标签: php

在使用PHP将新照片上传到Linux服务器时,我必须给它们唯一的名称(使用它的文件名被排除在外)。没有与数据库的交互,因此也无法获取唯一ID。

我想过使用 DATE + TIME.jpg ,但这太长了。

那么用PHP创建最短的唯一名称的最佳方法是什么?

10 个答案:

答案 0 :(得分:8)

使用tempnam()

$filename = tempnam  ($dir, $prefix)

它在指定目录中创建一个具有唯一名称的文件。生成的文件名很短,保证是唯一的。

答案 1 :(得分:3)

最简单的安全方法是使用 uniqid()功能。

答案 2 :(得分:2)

您也可以使用与bit.ly这样的网址缩写器生成其唯一的5个字符文件夹名称(例如bit.ly/x3hs0)的相同类型的散列。

There's an implementation in PHP here

答案 3 :(得分:1)

创建索引文件;此文件包含用于文件的最后一个ID。需要创建新文件时:

  1. 锁定索引文件(如果您的操作系统支持)
  2. 阅读ID
  3. 在ID中添加1
  4. 保存文件
  5. 解锁文件
  6. 使用该ID
  7. 创建文件

    的问候,
    斯泰恩

答案 4 :(得分:1)

嗯,问题是你想要一些独特且简短的东西。你真的不能兼得。

人类可读的随机数的最密集表示类似于base64(替换不应该在文件名中的任何字符的有效字符)。但是,这仍然意味着文件名中每个字符只有“64”变体。

如果你想要一个简单的文件名,只需使用递增的数字并在base64中对其进行编码(如果你想要一个最小的名字长度,请将其填充)。如果你想要它是不可猜测的,你需要一个随机数生成器,但是你需要确保避免双打或者你最终会覆盖文件。名字越短,这种灾难的机会越多。

您可能使用自己的自定义等效的base64,其字符数多于该编码提供的64个字符,但是您必须检查您的操作系统认为有效的文件名是什么,您仍然需要确保客户端可以正确访问它(如果它不仅仅是一个临时数据存储)。最简单的方法是创建一个字符串,其中包含您希望在其中合法的每个字符,然后将数字的基数转换为字符串的长度(如果您不知道Google上有基本转换的解释)怎么做)。这样可以实现更高的信息密度,甚至更短的文件名。

答案 5 :(得分:1)

我一直在做的是将文件名设置为文件本身的MD5哈希值 - 这样做的副作用是避免重复上传占用空间,此外,您可以非常轻松地验证数据完整性。

如果你想让它更短,你就可以开始斩断末端,但你做的越多,文件冲突的风险就越大,但根据经验,前8个左右的字符通常可以保证唯一性。不要上传太多。

答案 6 :(得分:0)

如果我是你,我只会生成一个大约6个字符长的随机数,并在do {} (while)循环中进行操作直到它是唯一的。

答案 7 :(得分:0)

一种方法是使用随机文件名。像rand(0,99999999)+".jpg"一样。 碰撞的可能性非常小(如果你没有大量的图像),你可以很容易地检查一下这个名字是否已被采取并在这种情况下获得一个新名称。

答案 8 :(得分:0)

最短不是最好的方法。我想你可以使用md5($ date + $ time)函数来获取唯一的文件名。它将是这样的:8d41627e46d5b8556d0d3e30ec15538e。

此外,如果您认为上传文件的数量很多,您可以将目录结构除以具有名称的文件夹,例如,由md5()哈希的前两个字母组成:

8d/
  + 8d41627e46d5b8556d0d3e30ec15538e.jpg
  + 8d897234ed899a523c88273c009c12c2.jpg
ce/
  + ce2389898ace097cc667e134abb61729.jpg
...

答案 9 :(得分:0)

您可以使用随机数和日期+时间方案,并检查名称是否存在于while()循环中:

$new_name = md5( rand(0,99999) . date('Ymd') . microtime(true) ) . $extension;
while ( file_exists($path . $new_name) ) 
   $new_name = md5( rand(0,99999) . date('Ymd') . microtime(true) ) . $extension;

其中 $ new_name 是您上传文件的简称

$ extension 是您文件的扩展名(如.jpg)

$ path 是必须保存文件的目录的完整路径

使用 rand()加上 microtime(true)会增加为第一次拍摄找到唯一名称的机会......