PHP随机生成图片文件名。

7

好的,我在使用谷歌上找到的代码片段,用于获取用户上传的图像并将其放置在我的Content目录下。

但我担心会出现重复的情况,所以我想让它将图像上传为随机数。

以下是我的代码,您可以通过它理解我的意图。

<label for="file">Profile Pic:</label> <input type="file" name="ProfilePic" id="ProfilePic" /><br />

<input type="submit" name="submit" value="Submit" />

$ProfilePicName = $_FILES["ProfilePic"]["name"];
$ProfilePicType = $_FILES["ProfilePic"]["type"];
$ProfilePicSize = $_FILES["ProfilePic"]["size"];
$ProfilePicTemp = $_FILES["ProfilePic"]["tmp_name"];
$ProfilePicError = $_FILES["ProfilePic"]["error"];

$RandomAccountNumber = mt_rand(1, 99999);  
echo $RandomAccountNumber; 
move_uploaded_file($ProfilePicTemp, "Content/".$RandomAccountNumber.$ProfilePicType);

在完成所有这些步骤后,我将尝试将随机数存入我的数据库。

有人给了我一个新的代码片段,看起来可以实现我的要求,但是现在该文件没有完全传输到我的目录。

$RandomAccountNumber = uniqid();
echo $RandomAccountNumber;

move_uploaded_file($ProfilePicName,"Content/".$RandomAccountNumber);

2
那里面有隐藏的问题吗? - Yes Barry
在将图像保存到目录之前尝试定义它,而不出现重复的ID? - bush man
5个回答

20

谢谢,让我试着让它工作,如果有问题,我会给您发消息的。 - bush man
嗯,我已将它更改为以下内容: $RandomAccountNumber = uniqid(); echo $RandomAccountNumber; move_uploaded_file($ProfilePicName,"Content/".$RandomAccountNumber);但现在文件没有被移到目标文件夹? - bush man
@bushman,我认为你需要将它保留为move_uploaded_file($ProfilePicTemp,“Content /”.$RandomAccountNumber。$ProfilePicType),因为你需要使用$ProfilePicTemp找到文件。 - DiverseAndRemote.com
嗯,现在它们通过了,但是它们失去了文件类型,所以它们以5032ioifh随机垃圾的形式传输,而不是5032ioifh.jpg。抱歉,我知道你现在可能会叹气,我只是一个试图掌握这个的新手,但我觉得我上瘾了lol。 - bush man
是的,你的问题与唯一标识有关。你的第二个问题是“如果给定一个 MIME 类型,如何获取文件扩展名”,你可以在 https://dev59.com/-3M_5IYBdhLWcg3w9oWG 上找到答案。 - DiverseAndRemote.com
显示剩余4条评论

5
这是我上传图片时使用的组合:session_id()time()和一个随机字符串。请保留HTML标签。
$rand = genRandomString();
$final_filename = $rand."_".session_id()."_".time();

function genRandomString() 
{
    $length = 5;
    $characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWZYZ";

    $real_string_length = strlen($characters) ;     
    $string="id";

    for ($p = 0; $p < $length; $p++) 
    {
        $string .= $characters[mt_rand(0, $real_string_length-1)];
    }

    return strtolower($string);
}

我希望这有所帮助。

由于会话ID可能包含逗号,使用这种方法在文件名中是否会有任何问题? - kojow7

5
当我上传图片时,通常将其保存为图像内容的 sha1()sha1_file())哈希值。这样,你就可以一举两得:你永远不会(如果你确实有重复文件名,请去填写最近的彩票),获得重复文件名,并且防止重复的图像(因为重复的图像将具有相同的校验和)。
然后,你需要一个数据库来分辨哪个图像是哪个,并正确地向用户显示它们。

2
我认为这种方法不好。如果两个用户上传相同的LOL猫,然后一个用户将其删除,会怎样呢? - DiverseAndRemote.com
@MadaraUchiha 你使用 sha1 还是 sha1_file?只是好奇。 - Yes Barry
@mmmshuddup: 我使用 sha1_file()。许多人(出于某种奇怪的原因)喜欢使用 sha1(file_get_contents()) - Madara's Ghost
@MadaraUchiha 哦,好的。是的,这很奇怪。实际上我从来没有见过这种方法,所以我很好奇。你应该提供一小段代码片段 :) - Yes Barry
1
@OmarJackman:唯一标识是随机的,但这不是。我在处理存储数十万张图片的画廊项目时使用了这种解决方案。你需要某种系统来管理它,否则你将无法摆脱这些代码。 - Madara's Ghost
显示剩余6条评论

3

随机 != 唯一

无论您使用什么方法生成“随机”文件名,您都可能希望这样做以避免冲突。

$path = '/path/to/directory/';
do {
    $filename = some_function();
} while( file_exists($path.$filename) );

如果您只是希望在一百万分之一的文件名冲突情况下获得内心的平静,那么这几行额外的代码就可以解决问题。(这并非必需)


将此与Omar Jackman的答案结合起来,它将是完美的答案。 - Yes Barry

1

我最喜欢的Coding Horror文章之一解释了为什么这种方法比看起来更愚蠢,你应该使用uniqid而不是mt_rand(1, 99999);...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接