2010-02-25 2 views
6

PHP를 사용하여 새 사진을 Linux 서버에 업로드하는 동안 파일 이름이 제외 된 고유 한 이름을 지정해야합니다. DB와의 상호 작용이 없으므로 고유 한 ID를 얻는 것도 불가능합니다.업로드 된 사진의 짧은 파일 이름을 생성하는 방법은 무엇입니까?

DATE + TIME.jpg으로 생각했지만 너무 길었습니다.

PHP로 가능한 가장 짧은 고유 이름을 만드는 가장 좋은 방법은 무엇입니까?

답변

8

tempnam()을 사용하십시오.

$filename = tempnam ($dir, $prefix) 

지정된 디렉토리에 고유 한 이름으로 파일을 생성합니다. 생성 된 파일 이름은 매우 짧으며 고유 한 것으로 보장됩니다.

+0

생성 된 파일에 확장자가없고 확장자를 수동으로 추가하면 고유성 보장이 깨집니다. – Farhadi

0

만약 내가 당신이라면 나는 단지 약 6 자의 난수를 생성하고, 그것이 유일 할 때까지 do {} (while) 루프에서해야 할 것입니다.

0

한 가지 방법은 임의의 파일 이름을 사용하는 것입니다. rand(0,99999999)+".jpg"처럼. 충돌 가능성은 매우 적습니다 (이미지가 많지 않은 경우). 그리고 어떤 괴물에 의해 이미 이름이 찍혔는지 쉽게 확인할 수 있습니다.

+0

나는 이것에 강력히 충고한다. 난수 생성기가 어떻게 뿌려 지는지에 따라, 놀랍게도 빠르게 충돌 할 수있다. –

2

bit.ly과 같이 url 단축 기호를 사용하여 고유 한 5 자 폴더 이름 (예 : bit.ly/x3hs0)을 생성하는 것과 같은 종류의 해싱을 사용할 수도 있습니다.

There's an implementation in PHP here.

0

최단 시간은 가장 좋은 방법은 아닙니다. 나는 당신이 md5 ($ date + $ time) 함수를 사용하여 유일한 파일 이름을 얻을 수 있다고 생각한다. 다음과 같이됩니다 : 8d41627e46d5b8556d0d3e30ec15538e.

8d/ 
    + 8d41627e46d5b8556d0d3e30ec15538e.jpg 
    + 8d897234ed899a523c88273c009c12c2.jpg 
ce/ 
    + ce2389898ace097cc667e134abb61729.jpg 
... 
1
: 당신은 업로드 된 파일의 큰 수있을 것이라고 생각하면

또한, 당신은 이름으로 폴더하여 디렉토리 구조를 나눌 수 있습니다, 예를 들어, 해시) (MD5의 첫 두 글자로 구성

색인 파일을 만듭니다. 이 파일에는 파일에 사용 된 마지막 ID가 들어 있습니다.

  1. 이 (당신의 OS가 지원하는 경우)
  2. ID를
  3. 파일을 저장
  4. 잠금 해제에 1을 추가 ID 읽기 인덱스 파일을 잠글 : 새 파일이 생성 될 필요가있는 경우 파일이
  5. 해당 ID를 가진 파일을 만듭니다

관련,
Stijn

+0

다른 사람들이 숫자를 변경하여 이미지를 탐색하기가 매우 쉽습니다. (원하는 것은 아닐 수도 있습니다.) –

+0

참; 만약 당신이 이것을 원하지 않는다면 증가 된 숫자를 사용하는 것은 선택 사항이 아닙니다. 예를 들어, 1 대신에 13 씩 늘릴 수도 있습니다. ... –

1

글쎄, 문제는 당신이 뭔가 독특하고 짧게하고 싶다는 것입니다. 둘 다 가질 수는 없습니다.

사람이 읽을 수있는 난수의 가장 정밀한 표현은 base64 (파일 이름에 포함되지 않아야하는 모든 문자에 유효한 문자로 대체)과 같습니다. 그러나 여전히 파일 이름의 각 문자에 대해 "유일한"64 개의 유사어가 있음을 의미합니다.

간단한 파일 이름을 원하면 증분 번호를 사용하고 base64로 인코딩하십시오 (이름의 최소 길이를 원한다면 빼내십시오). 추측 할 수 없도록하려면 난수 생성기가 필요하지만 복식을 피하려면 파일을 덮어 쓰게됩니다. 이 재앙의 기회는 이름이 짧은만큼 높습니다.

해당 인코딩에 제공된 64보다 많은 문자로 base64를 사용자 정의 할 수는 있지만 OS가 올바른 파일 이름으로 간주하는지 확인해야합니다. 클라이언트는 임시 데이터 저장소가 아닌 경우 올바르게 액세스 할 수 있습니다. 이렇게하는 가장 쉬운 방법은 합법적 인 모든 문자로 문자열을 만든 다음 문자열의 길이에 관계없이 숫자의 기준을 변환하는 것입니다 (모르는 경우 Google에 기본 변환에 대한 설명이 있습니다). 그렇게하는 방법). 그러면 더 높은 정보 밀도와 더 짧은 파일 이름을 허용 할 수 있습니다.

3

가장 안전한 방법은 uniqid() 기능을 사용하는 것입니다.

0

당신은 임의의 숫자와 날짜 + 시간 schem를 사용하여 이름이 잠시 동안() 루프에 존재하는지 확인할 수 있습니다

$new_name = md5(rand(0,99999) . date('Ymd') . microtime(true)) . $extension; 
while (file_exists($path . $new_name)) 
    $new_name = md5(rand(0,99999) . date('Ymd') . microtime(true)) . $extension; 
$ NEW_NAME가 업로드 한 파일

의 짧은 이름입니다

$ 확장

$ 경로이의 전체 경로 당신의 확장 (.JPG 같은) 파일입니다 파일이이 디렉토리는

를 저장하는 랜드() 플러스 microtime (true)를 첫 번째 촬영의 고유 한 이름을 찾을 수있는 기회 inscrease의 사용 ... 난 항상 무엇

1

이 파일 이름을 파일 자체의 MD5 해시로 설정합니다. 부작용은 공간을 차지하는 중복 업로드를 방지하고 데이터 무결성을 매우 쉽게 검증 할 수 있다는 것입니다.

더 짧게 만들려면 끝에서 비트를 자르기 시작할 수 있지만 더 많이하면 파일 이름 충돌이 발생할 수 있지만 처음 8 자 정도의 문자를 사용하면 일반적으로 고유성이 보장됩니다. 너는 너무 많이 업로드하지 않는다.

관련 문제