所有的想法我需要确保文件不会保存一次以上,也不会丢失任何文件,因为如果两个文件相同(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;
然后,您应该将文件名插入数据库中,以便以后可以访问它。