2

所有的想法我都需要确保该文件不会保存超过一次并且不会丢失任何文件,因为如果两个文件相同(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.';
}

谢谢大家

4

4 回答 4

3

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

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

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

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

我一直在按照您在此处为图片库建议的方式使用 md5 方法,并且效果很好。

要注意的另一件事是计算哈希所需的时间,哈希越复杂,它需要的时间就越多,但我说的是处理非常大的批次。

于 2014-04-15T11:58:56.650 回答
1

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

手册指出:

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

以下应该足够好:

$targetDirectory = $_SERVER['DOCUMENT_ROOT'] . '/test/uploadify/uploads';
$uploadedFile = $_FILES['Filedata']['tmp_name'];
$targetFile = tempnam($targetDirectory, '');
move_uploaded_file($uploadedFile, $targetFile);
于 2014-04-13T11:32:27.163 回答
0

这是非常小的,但机会是存在的。你可以在这里这里阅读更多

我建议您在文件名的末尾添加一个盐,以使文件几乎不可能发生冲突(尽管您应该将盐放在不同的 md5 函数中)

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

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

于 2014-04-13T09:06:30.180 回答
0

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

于 2014-04-13T09:16:20.737 回答