是这样 用户可以上传多张图片
在一个文件夹里
怎么判断此文件夹是否存在一个与用户上传的文件一样的文件的话(md5_file)打个比方 我images文件夹里有  201204055454541.jpg 201204035454.jpg 后面省略
用户新上传了一个文件1.jpg  我判断我的IMAGES里是否存在和1.jpg md5散列相同的文件,如果存在返回此文件名,不存在返回FALSE。要全部循环 然后一个一个比?

解决方案 »

  1.   

    上面说的我不太明白意思?你是说把MD5散列存入数据库
    我想到一个方法。
    每当用户上传了一个文件
    我把此文件的MD5散列和文件名存入数据库
    当用户新上传的时候,拿到新文件的MD5散列$newFileMD5。然后select file_name from fileTable where md5_filed=$newFileMD5 limit1 如果查询到结果 就是他的文件名 然后就不做文件的上传 直接用以前的 如果没有就新上传一个可行吗??
      

  2.   


    function find($filename) {
      $ar = array_map('md5_file', glob('images/*.*'));
      return in_array(md_file($filename), $ar);
    }
    每次都计算全部文件的 md5_file 肯定是不妥的,效率很低
    你可以将散列值缓存起来,方便以后查找
      

  3.   

    遍历文件夹中的文件,将所有文件的MD5值与上传文件的MD5值对比:/****************************
     * 获取目录下的所有文件
     * [$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
    );
    }
      

  4.   

    就是把用户上传的文件重命名了,而不是用原来的名字,如果用户每次都传的照片是1.jpg但是内容都不一样怎么办??
    重命名的方式呢就是时间戳+随即数,或者其他策略。
      

  5.   


    一般来讲 应该 每个用户专门生成他自己的文件夹如果把很多图片都放在 同一个文件夹 性能会很慢 这里不建议进行数据库 筛选。因为你的数据库查询是否 有重复 比io判断效率更低 
    php 的io判断 性能是很不错的 
    如  while (file_exists($uploadDirectory . $filename . '.' . $ext)) {
                    $filename .="_". rand(10, 99);
                }--------------
    http://banmee.net 中文摄影社区