我可以在上传时使用函数md5_file命名文件而不与名称冲突吗


can i use the function md5_file to name files when upload without having conflict with names?

所有的想法我需要确保文件不会保存一次以上,也不会丢失任何文件,因为如果两个文件相同(md5),第二个文件将不会保存(我的目标是不要在硬盘上保存两次相同的文件)

换句话说,如果一个用户上传了图像,然后另一个用户又上传了相同的图像,我不需要保存第二个图像,因为它已经存在于硬盘中,所有这些都是因为我需要节省硬盘空间这是我的代码,它运行良好

$targetFolder = '/test/uploadify/uploads'; // Relative to the root
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
$myhash = md5_file($_FILES['Filedata']['tmp_name']);
$temp = explode(".", $_FILES['Filedata']['name']);
$extension = end($temp);
$targetFile = rtrim($targetPath,'/') . '/' .$myhash.'.'.$extension;
if(file_exists($targetFile)){
    echo 'exist';
}
// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);
if (in_array($fileParts['extension'],$fileTypes)) {
    move_uploaded_file($tempFile,$targetFile);
} 
else {
    echo 'Invalid file type.';
}

感谢大家

当然可以这样做,事实上这是我用来避免文件重复的方法(我的意思是不要有两个内容相同的文件,而不仅仅是愚蠢的名称冲突)。

如果你担心碰撞,那么你可以看看sha1_file:

http://es1.php.net/manual/en/function.sha1-file.php

两条消息具有相同MD5摘要和相同SHA1摘要的可能性有多大?

我一直在使用md5方法,就像你在这里为图片库建议的那样,它运行得很好。

另一件需要注意的事情是计算哈希所需的时间,哈希越复杂,需要的时间就越多,但我说的是处理真正的大批量。

如果我正确理解你的问题,你的目标只是生成唯一的文件名。如果是这样,那么重新设计轮子就没有意义了——每个输出长度固定的哈希函数都会发生冲突——只需使用内置的tempnam函数。

手动状态:

在指定的目录中创建具有唯一文件名、访问权限设置为0600的文件。如果目录不存在,tempnam()可能会在系统的临时目录中生成一个文件,并返回该文件的完整路径,包括其名称。

以下应该足够好:

$targetDirectory = $_SERVER['DOCUMENT_ROOT'] . '/test/uploadify/uploads';
$uploadedFile = $_FILES['Filedata']['tmp_name'];
$targetFile = tempnam($targetDirectory, '');
move_uploaded_file($uploadedFile, $targetFile);

您可以始终将系统当前时间(以毫秒为单位)添加到文件名中。再加上md5,将不太可能返回相同的值。

这很小,但机会就在那里。你可以在这里和这里阅读更多

我建议你在文件名的末尾添加一个salt,使文件几乎不可能发生冲突(不过你应该把salt放在不同的md5函数中)

$salt = md5(round(microtime(true) * 1000));
$hash = md5_file($_FILES['Filedata']['tmp_name']);
$targetFile = rtrim($targetPath,'/') . '/' .$hash.$salt.'.'.$extension;

然后,您应该将文件名插入数据库中,以便以后可以访问它。