【发布时间】:2009-07-22 06:55:56
【问题描述】:
我真正想做的是在上传文件之前或之后检查相同的文件是否存在,有没有一种有效的方法?
嗯,就是这样!
编辑:实际上它是在之后还是之前并不重要,只要它可以检测到重复即可。
【问题讨论】:
标签: php javascript flash
我真正想做的是在上传文件之前或之后检查相同的文件是否存在,有没有一种有效的方法?
嗯,就是这样!
编辑:实际上它是在之后还是之前并不重要,只要它可以检测到重复即可。
【问题讨论】:
标签: php javascript flash
您无法在上传文件之前进行检查。
上传后,您可以比较文件的file sizes 和MD5s 以检查它们是否相同。
【讨论】:
编辑:抱歉没有意识到您之前说过...您可以做的是在启用上传按钮之前使用 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";
【讨论】:
如果不使用 AJAX 或 flash,您将无法做到这一点,因为 PHP 负责上传本身,并且您的脚本从文件已上传的位置开始。我会在您的答案中添加适当的标签,以便有人可以帮助您
【讨论】:
你只有几个选择:
选择你喜欢的!
【讨论】:
正如其他人之前指出的那样,在上传之前进行检查是不可能的。但是一旦文件上传,你应该比较文件的 MD5 哈希。
您可以考虑保留一个用于缓存结果的小型数据库,而不是一遍又一遍地计算文件的 MD5 哈希值。那应该更高效。
【讨论】:
对此有更好的解决方案。
如果你只需要找出两个文件是否相同,比较 文件哈希可能效率低下,尤其是在大文件上。没有 如果第二个字节,读取两个完整文件并进行所有数学运算的原因 每个文件的内容都不一样。如果不需要存储哈希值 供以后使用,可能不需要计算哈希值 只是为了比较文件。
可以在此处找到更快的解决方案: http://php.net/manual/en/function.md5-file.php#94494
100% 确定,之后您仍然可以使用 md5_file 方法。
【讨论】: