如何检查PHP中的重复文件?

时间:2009-07-22 06:55:56

标签: php javascript flash

我真正想要做的是检查在上传文件之前或之后是否存在相同的文件,有没有一种有效的方法呢?

嗯,就是这样!

编辑:实际上,无论是之前还是之后,只要它可以检测到重复就无所谓。

6 个答案:

答案 0 :(得分:4)

上传文件前无法检查 上传后,您可以比较文件的file sizesMD5s,以检查它们是否相同。

答案 1 :(得分:1)

编辑:抱歉没有意识到你之前说过...你可以做的是在启用上传按钮之前使用AJAX查询服务器。

脚本:

function CreateRequest()
{
var xmlhttp = false;

if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
        xmlhttp = new XMLHttpRequest();
    } catch (e) {
        xmlhttp=false;
    }
}

if (!xmlhttp && window.createRequest) {
    try {
        xmlhttp = window.createRequest();
    } catch (e) {
        xmlhttp=false;
    }
}

if(!xmlhttp)
{
    alert("Could not create XmlHttpRequest. Browser does not support.");
}

return xmlhttp;
}


function validate()
{
    xmlhttp = CreateRequest();
    xmlhttp.open( "GET", "checkfile.php?file=" + document.getElementById('upload').value );
    xmlhttp.send( false );
    if( xmlhttp.responseText == "YES" )
        alert( "File already exists" );
    else
        document.getElementById('go').disabled = false;
}

HTML:

<input id="upload" type="file" name="upload" onchange="validate()"/>
<input name="Reset" type="submit" disabled=disabled id="go" value="Go"/>

PHP:

$file = basename( $_GET['file'] );
if( file_exists( "uploads/$file" ) )
    echo "YES";
else
    echo "NO";

答案 2 :(得分:1)

如果不使用AJAX或Flash,则无法执行此操作,因为PHP负责上传本身,并且您的脚本在文件已上载的位置开始。我会在你的答案中添加适当的标签,以便有人可以帮助你

答案 3 :(得分:0)

你只有很少的选择:

  • 如果你想在用户上传之前知道,你问他md5文件的总和,然后服务器端你检查是否已经有文件(真的用户友好)。
  • 如果您的文件具有唯一名称,则在上传之前询问文件名称(用户友好)
  • 你不能在用户上传文件之前(不是你想要的......)

选择你喜欢的那个!

答案 4 :(得分:0)

在上传之前检查,正如其他人之前指出的那样,是不可能的。但是上传文件后,您应该比较文件的MD5哈希值。

您可以考虑保留一个缓存结果的小数据库,而不是一遍又一遍地计算文件的MD5哈希值。这应该更高效。

答案 5 :(得分:0)

有一个更好的解决方案。

  

如果你只需要找出两个文件是否完全相同,那就进行比较   文件哈希可能效率低下,尤其是在大文件上。没有   有理由读取两个完整的文件,并在第二个字节时进行所有数学运算   每个文件都不同。如果您不需要存储哈希值   供以后使用,可能不需要计算哈希值   只是为了比较文件。

可以在这里找到更快的解决方案: http://php.net/manual/en/function.md5-file.php#94494

要100%确定,之后你仍然可以使用md5_file方法。