是这样 用户可以上传多张图片
在一个文件夹里
怎么判断此文件夹是否存在一个与用户上传的文件一样的文件的话(md5_file)打个比方 我images文件夹里有 201204055454541.jpg 201204035454.jpg 后面省略
用户新上传了一个文件1.jpg 我判断我的IMAGES里是否存在和1.jpg md5散列相同的文件,如果存在返回此文件名,不存在返回FALSE。要全部循环 然后一个一个比?
在一个文件夹里
怎么判断此文件夹是否存在一个与用户上传的文件一样的文件的话(md5_file)打个比方 我images文件夹里有 201204055454541.jpg 201204035454.jpg 后面省略
用户新上传了一个文件1.jpg 我判断我的IMAGES里是否存在和1.jpg md5散列相同的文件,如果存在返回此文件名,不存在返回FALSE。要全部循环 然后一个一个比?
我想到一个方法。
每当用户上传了一个文件
我把此文件的MD5散列和文件名存入数据库
当用户新上传的时候,拿到新文件的MD5散列$newFileMD5。然后select file_name from fileTable where md5_filed=$newFileMD5 limit1 如果查询到结果 就是他的文件名 然后就不做文件的上传 直接用以前的 如果没有就新上传一个可行吗??
function find($filename) {
$ar = array_map('md5_file', glob('images/*.*'));
return in_array(md_file($filename), $ar);
}
每次都计算全部文件的 md5_file 肯定是不妥的,效率很低
你可以将散列值缓存起来,方便以后查找
* 获取目录下的所有文件
* [$dir] 文件夹路径
****************************/
function deepScanDir($dir) {
$fileArr = array ();
$dirArr = array ();
$dir = rtrim($dir, '//');
if (is_dir($dir)) {
$dirHandle = opendir($dir);
while (false !== ($fileName = readdir($dirHandle))) {
$subFile = $dir . DIRECTORY_SEPARATOR . $fileName;
if (is_file($subFile)) {
$fileArr[] = $subFile;
}
elseif (is_dir($subFile) && str_replace('.', '', $fileName) != '') {
$dirArr[] = $subFile;
$arr = $this->deepScanDir($subFile);
$dirArr = array_merge($dirArr, $arr['dir']);
$fileArr = array_merge($fileArr, $arr['file']);
}
}
closedir($dirHandle);
} return array (
'dir' => $dirArr,
'file' => $fileArr
);
}
重命名的方式呢就是时间戳+随即数,或者其他策略。
一般来讲 应该 每个用户专门生成他自己的文件夹如果把很多图片都放在 同一个文件夹 性能会很慢 这里不建议进行数据库 筛选。因为你的数据库查询是否 有重复 比io判断效率更低
php 的io判断 性能是很不错的
如 while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
$filename .="_". rand(10, 99);
}--------------
http://banmee.net 中文摄影社区