2011-02-17 5 views
2

첫 번째 게시물은 내가 답변을 찾을 수없는 질문에 대한 대답이 아닌 다른 사람에게 도움이 될 수 있습니다.증분 복제 중복 파일

문제는 파일 업로드를 로컬에서 저장하고 중복 된 파일 이름을 처리 할 수있는 좋은 방법을 찾으려고했습니다.

이 형성 할 수 여기서 filename.ext의 파일 이름이 누군가

도움이 될 이미

$file = "upload.jpg"; 

    while(is_file($file)) 
    { 
     preg_match("/\d+\.[^.]*$/", $file, $matches); 
     if (!$matches) 
     { 
      $file = preg_replace('/(\.[^.]*)$/', '-1${1}', $file); 
      echo $file."<br>"; 
     } 
     else 
     { 
      list($i, $extension) = explode(".",$matches[0]); 

      $file = preg_replace('/(\d+\.[^.]*)$/', ++$i.".".$extension, $file); 
     } 
} 

    echo $file; 

희망을 존재하지 않는 형태의 파일명 -의 \ d 개 + .ext를 첫 번째 파일 이름을 줄 것이다 감안할 때

+3

환영합니다. 그 자리에 질문을 게시해야합니다. 다른 사람들이 물을 때 대답 해주세요 :) – Sarfraz

+2

Sarfraz가 제안했듯이 실제 질문에 "질문"을 다시 말한 다음 대답으로 게시합니다. ;) –

답변

3

이 알고리즘은 확장 할 수 없습니다. 같은 이름을 가진 N 파일을 업로드하는 것은 O (N ²를)로 이어지는이 알고리즘 (N) 행동, O의 원인이됩니다 O를 포함하여, 시간을 누적 합계 (N ²) 파일 시스템에 액세스합니다. 그것은 서버 응용 프로그램에 대한 꽤 아니에요. 또한 파일 시스템의 작동 방식으로 인해 수정할 수 없습니다.

더 나은 솔루션 : 그 사용 횟수에 매핑 이미 DB 테이블에 사용 된

  1. 저장 파일 이름.
  2. 파일 이름에 높은 세분성 타임 스탬프를 넣습니다.
  3. 내용의 SHA1 (또는 MD5) 해시를 파일 이름으로 사용하십시오. 또한 중요한 경우 중복 파일 업로드를 방지합니다.

데이터베이스를 사용하여 필요에 따라 파일 이름을 사람이 읽을 수있는 이름으로 다시 매핑합니다.

1

최상의 솔루션은 YYYYDDMMHHMMSS 형태로 타임 스탬프를 첨부하면 평생 동안 갈등을 피할 수 있습니다.) 시간 복잡도는 매우 적습니다. 당신이 할 수있는 또 다른 일 .. 직접 파일 이름 대신에 이름 확인을 생략 할 수 있습니다. "1.jpg" 을 업로드하는 경우 1 (타임 스탬프) .jpg 만 첨부하면 파일 시스템을 반복 할 필요가 없습니다. 도움이되기를 바랍니다.

ex. PHP로

$timestamp=date("YmdGis"); 
it will generate something like 
20111122193631 
;) 
0

나는 내 자신의 솔루션을 만들었습니다. 여기에 있습니다 :

function recursive_increment_filename ($path, $filename) 
    { 
     $test = "{$path}/{$filename}"; 
     if (!is_file($test)) return $test; 

     $file_info = pathinfo($filename); 
     $part_filename = $file_info['filename']; 

     if (preg_match ('/(.*)_(\d+)$/', $part_filename, $matches)) 
     { 
      $num = (int)$matches[2] +1; 
      $part_filename = $matches[1]; 
     } 
     else 
     { 
      $num = 1; 
     } 
     $filename = $part_filename.'_'.$num; 

     if (array_key_exists('extension', $file_info)) 
     { 
      $filename .= '.'.$file_info['extension']; 
     } 

     return recursive_increment_filename($path, $filename); 
    } 

$url = realpath(dirname(__FILE__)); 

$file = 'test.html'; 
$fn = recursive_increment_filename($url, $file); 

echo $fn;