업로드 된 이미지의 이름을 지정하는 가장 좋은 방법은 무엇입니까?


15

사용자가 프로필 사진을 업로드 할 수있는 양식이 웹 응용 프로그램에 있다고 가정합니다.

파일 크기, 크기 등에 대한 요구 사항은 거의 없지만 사용자가 이미지를 업로드 할 때 시스템에서 이름을 어떻게 지정해야합니까? 일관성 있고 독창적이어야한다고 생각합니다.

아마 GUID?

a5c627bedc3c44b7ae7c06a44fb3fcf8.jpg

타임 스탬프?

129899740140465735.jpg

해시? 예 : md5

b1a9acaf295cf14ffbc5b6538294562c.jpg

이를 수행하기위한 표준 또는 권장 방법이 있습니까?


7
사용자 당 하나의 프로필 사진 만 저장하는 것이 목표 인 경우, 파일 이름을 사용자 ID와 동일하게 지정하는 것이 확실한 선택 일 수 있습니다.
Alan Barber

DateTime.Now는 15ms마다 새로 고쳐지기 때문에 타임 스탬프는 좋은 생각이 아닙니다. 예를 들어 벌크로드, 대기 요청 등에서 충돌 가능성이 높습니다.
jhexp

답변:


27

독창성과 유용성의 두 가지 목표를 달성하려고 노력해야합니다.

GUID를 사용하면 고유성이 보장되지만 언젠가는 파일이 원본에서 분리되어 문제가 발생할 수 있습니다.

필자의 일반적인 해결책은 userID (사용자에게 속한 경우) 또는 업로드 된 날짜와 시간 (유의 한 경우) 또는 업로드시 사용 된 파일 이름과 같은 중요한 정보를 파일 이름에 포함시키는 것입니다.

파일 이름에 포함 된 정보를 통해 버그 나 실수로 레코드를 삭제하는 등의 작업을 수행 할 수 있습니다. GUID 만 있고 카탈로그를 잃어버린 경우 정리 작업이 줄어 듭니다.

예를 들어, 2013/04/04에 userID 98765로 "My Holiday : Florida 23.jpg"파일을 12:51:23에 업로드하면 임의의 문자열을 추가하여 다음과 같이 이름을 지정합니다 ad8a7dsf9.

20130404125123-ad8a7dsf9-98765-my-holiday-florida-23.jpg

  • 고유성은 날짜 및 시간과 임의 문자열 (/ dev / urandom 또는 CryptGenRandom에서 적절하게 무작위로 제공됨)에 의해 보장됩니다.
  • 파일이 분리 된 경우 사용자, 날짜 및 시간 및 제목을 식별 할 수 있습니다.
  • 모든 것이 소문자로 접혀지고 영숫자가 아닌 것은 제거되고 대시로 대체됩니다. 간단한 도구를 사용하여 파일 이름을 쉽게 처리 할 수 ​​있습니다. , 등등).

7
하우스 키핑을 위해 userID마다 별도의 디렉토리를 생성하여 사용자를 삭제하면 모든 사진을 찾아 다닐 필요가 없도록하는 것이 좋습니다. - 그래서98765/20130404125123-ad8a7dsf9-my-holiday-florida-23.jpg
Shadur

1
이론적으로 독창성은 임의 문자열에 의해 제공되지 않습니다.
Kolyunya

4
@Kolyuny, 그것은 사실입니다 .Global Uniqueity는 GUID조차도 실제로 소유 한 속성이 아니라는 점에서 (v1 guid도 중복 MAC 주소 발급으로 인해 파열됩니다). 당신이 얻을 수있는 것은 독창성의 통계적 가능성입니다. 그러나 파일이 이미 존재하는지 (원자 적으로 CreateFilewith 사용 CREATE_NEW) 확인하고 파일이 있으면 다른 임의성을 사용하여 고유성을 보장 할 수 있습니다 .
Ben

내가 아닌 모든 알파 숫자를 제거하고 마지막으로 대시를 제외하고 점수에 따라 교체, 혼합 된 경우 보관 것 '모든 것이 제거 및 대시로 대체되는 경우와 아무것도 아닌 숫자를 낮추기 위해 접혀'
tgkprog

4

탐색기와 같은 응용 프로그램에 스트레스를주지 않고 디렉토리를 열 때 충돌이 발생합니다. 실제 파일 시스템에 스트레스를 줄 것 같지는 않지만 수천 개의 파일을 저장하려면이를 고려해야합니다.

수천 개의 파일을 저장하려면 폴더로 분할하는 것이 좋습니다. 예를 들어 upload\silo001, upload\silo002등. 파일 균형을 조정하거나 폴더가 특정 수의 파일에 도달 할 때까지 기다렸다가 다른 파일을 만들 수 있습니다.

명명과 관련하여 GUID를 사용하여 파일 이름을 지정합니다. GUID는 전역 적으로 고유하기 때문입니다. 업로드에서 확장자를 가져 와서 파일 확장자를 일치하도록 설정했지만 실제 이름은 새 Guid에서 설정됩니다.

당신이 RDBMS와 함께이 일을 등 몇 가지 범주, 즉 제품, 카테고리를 가지고 있다면 당신은 할 수있다 upload\products, upload\categories등, 당신은 파일 이름으로 행 ID를 사용할 수 있습니다.

모범 사례 측면에서, 나는 과거를 보았지만 아무것도 찾지 못했습니다. 내 개발자 중 일부와 논의하면서 위의 내용을 생각해 냈습니다.


2

몇 년 전에 내가 일한 솔루션 중 하나에서 우리는 이렇게했습니다 : 사용자 ID의 일부에 대한 하위 폴더이므로 사용자 ID가 232950192 인 경우

하위 폴더 images / 23 / 29 / 50 / 192 / 232950192

최종 폴더에는 albuns 및 프로파일 imgs 등의 폴더가 있습니다.

그러나 우리는 데이터베이스에 모든 것을 저장하고 빠른 웹 서버 액세스를 위해 파일 시스템에 보관합니다 (캐싱도 있음)

어쨌든 최종 이미지는 원래 이미지 이름을 갖습니다. 버전을 유지할 필요가 없었습니다. 그러나 더 많은 하위 폴더를 최종 앨범 이름 아래 또는 버전 ID가있는 데이터베이스에 보관할 수 있습니다. 일단 생산에 들어가면 현재 구조에서 시간이 많이 걸리고 오류가 발생하기 쉬운 수정없이 변경하기가 어려울 것이라고 생각해야 함

Java로 하위 폴더를 만들고 그 안에 파일을 만드는 것은 매우 쉽습니다.

    File folder = new File(pathwithslashes);// like "images/23/29/50/192/232950192"
    folder.mkdirs();
    File imgFile = new File(folder, name);
    //Now get output stream etc

하위 폴더에서 날짜 스탬프를 얻으려면 : SimpleDateFormat sdf = 새 SimpleDateFormat ( "/ yyyy / MM / dd /"); pathwithslashes = pathwithslashes + sdf.format (now); // now는 util.Date File 폴더 = new File (pathwithslashes);

닷 넷 /programming/5482230/c-sharp-equivalent-of-javas-mkdirs


중첩 디렉토리를 제안하면 +1입니다. 폴더에 "너무 많은"파일 ( 스택 오버 플로우 .com / questions / 197162 /… , support.microsoft.com/kb/130694/en-us 등)이 포함 된 경우 다른 파일 시스템에서 성능 문제가 발생할 수 있으므로 고려해야 합니다 .
deizel

1
예, 다른 시스템에서는 400,000 개가 넘는 파일이있는 dir에서 rmdir을 시도 할 때 웹 서버가 정지되었습니다. 이런 폴더가 더있었습니다. 그런 다음 dir / p라는 사용자 정의 프로그램을 사용하여 한 번에 몇 개의 파일을 삭제할 수 있습니다. 몇 시간이 걸리지 만 가동 중지 시간은 없습니다 :)
tgkprog

1

md5 또는 개념적으로 동등한 것을 사용하는 것이 좋습니다. 내용을 요약하여 파일 이름을 바꾸면 고유성을 부여 할뿐만 아니라 가능한 한 오랫동안 이미지를 캐시하고 내용 기반 이름을 바꾸면 이미지를 실제로 영구적으로 캐시 할 수 있습니다.

또한 큰 문제는 아니지만 그럼에도 불구하고 다른 사용자가 정확히 동일한 이미지를 업로드하는 것은 순수한 가상의 사례가 아닙니다. 즉시 사용할 수있는 작은 데이터 저장소 최적화 기능이 있습니다.

다른 제안에 관해서는 : 나에 관해서는, 나는 모든 종류의 보조 정보를 파일 이름 으로 유지 하는 것에 반대 합니다. 내가 더 젊었을 때 (그리고 조금 더 얇아 졌을 때), 나는 Perl 개발자였으며 ​​Perl 문자열 패턴 기능이 훌륭하기 때문에 파일 이름에 보조 정보를 파일 이름으로 저장하는 모호한 습관을 가졌습니다. 그리고 나는 웹 개발에 대해 이야기하면서 항상 , 파일 이름과 별도로 파일과 관련된 데이터를 유지 더 나은 선택 .

오늘날 모바일 인터페이스가 지배적 일 때 실제 파일 이름은 5, 10 년 전보다 덜 중요합니다. 그러나 이것이 응용 프로그램의 맥락에서 중요 할지라도 Content-Disposition: attachment; filename="pretty_file_name.jpg"HTTP 헤더를 사용하여 원하는 파일 이름을 구성하는 데 항상 구식 마술을 사용할 수 있습니다 . 또한 최신 브라우저는 새로운 HTML5 속성 인 download 으로 포장되고 있습니다. 실제로 "사람이 읽을 수있는"이미지 이름을 보는 것이 대부분의 경우에 고려해야 할 것이라고 생각하지 않습니다.

UPD : 한 디렉토리에 너무 많은 파일이 없도록 수정이 가능합니다. 처음 3 글자를 가져 와서 dir을 만드십시오.


1
md5는 정말 독특합니까?
I.devries

@ I.devries, 나는 전문가가 아니지만 내가 아는 한,이 목적을 위해 충분합니다. 특히 파일의 크기를 추가로 확인하는 경우 좋은 해싱 알고리즘은 실제로 동일한 크기의 엔티티가 충돌 가능성을 낮게 부여하기 때문에 실제로 stackoverflow.com/questions/2442632/…
shabunc

-1

sha4와 같은 충돌 가능성은 무한합니다. 해시를 사용자 ID 또는 간단한 날짜와 결합하면 훨씬 적습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.