웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
파일업로드시 파일명 중복되지 않게 저장하기..
2004.06.28 18:14
FUNCTION Get_Filename($findname) {
// 주어진 파일명이 존재하는지 확인하여 존재할 경우 파일명앞에 n 을 붙여 새 이름으로..
$filename = $this->savedir . "/" . $findname;
if(is_file($filename)) {
return $this->Get_Filename("n" . $findname);
} else {
return $filename;
}
}
제가 사용하는 클래스의 메소드들중에서
사용자가 업로드한 파일명을 인자로 하고
서버측 저장디렉토리에 같은 파일명이 있는지 확인하여
같은 파일명이 있으면 별도의 문자 "n" 을 파일명 앞에 추가하여 반환하는 함수입니다.
$this->savedir : 서버측 저장디렉토리 경로
$findname : 업로드한 파일명 (path를 제외한 순수파일명)
사용예: 서버측 디렉토리에 a.txt 파일이 이미 존재하는 상황에서
사용자가 a.txt 라는 파일을 업로드시 na.txt 파일로 저장합니다.
재귀호출을 통해 중복되는 파일명이 없을때까지 n 을 추가하도록 설정하였습니다.
태클환영합니다. 초보인지라 부족한 부분이 있을수 있으니 많은 지적바랍니다.
ps; 저와같은 초보분들께 도움이 되었으면 해서 올린것뿐입니다.
중수 이상분들께서는 보는 순간 피식-_-; 하시겠지만요^^;
// 주어진 파일명이 존재하는지 확인하여 존재할 경우 파일명앞에 n 을 붙여 새 이름으로..
$filename = $this->savedir . "/" . $findname;
if(is_file($filename)) {
return $this->Get_Filename("n" . $findname);
} else {
return $filename;
}
}
제가 사용하는 클래스의 메소드들중에서
사용자가 업로드한 파일명을 인자로 하고
서버측 저장디렉토리에 같은 파일명이 있는지 확인하여
같은 파일명이 있으면 별도의 문자 "n" 을 파일명 앞에 추가하여 반환하는 함수입니다.
$this->savedir : 서버측 저장디렉토리 경로
$findname : 업로드한 파일명 (path를 제외한 순수파일명)
사용예: 서버측 디렉토리에 a.txt 파일이 이미 존재하는 상황에서
사용자가 a.txt 라는 파일을 업로드시 na.txt 파일로 저장합니다.
재귀호출을 통해 중복되는 파일명이 없을때까지 n 을 추가하도록 설정하였습니다.
태클환영합니다. 초보인지라 부족한 부분이 있을수 있으니 많은 지적바랍니다.
ps; 저와같은 초보분들께 도움이 되었으면 해서 올린것뿐입니다.
중수 이상분들께서는 보는 순간 피식-_-; 하시겠지만요^^;
댓글 8
-
써니루루☆
2004.06.29 01:45
-
앳플군
2004.07.01 18:43
저같은 경우에는 md5_file 함수를 이용해서 파일 내용의 해쉬로 파일을 저장합니다.
그리고 DB에 그 파일 정보를 저장하고, 카운트를 1 올립니다.
그리고 삭제 시에는 카운트를 1 내리고 0이 될 경우 파일을 완전히 삭제합니다.
다운로드 시에는 원래 이름으로 헤더를 쏴주고요.
atBBS에서 사용되고 있는 방법인데, 중복 파일이 올라올 시에 용량을 절약할 수 있다는 잇점이 있죠. (다만 파일이 크면 올릴 때 부하가 커지겠죠. 해쉬 계산하느라고요) -
써니루루☆
2004.07.01 19:48
앳플군 : md5_file 함수를 이용해서 얻은 해쉬를 이용해서 file 자체를 db에 넣는 다는 말씀이신가요?
DB에 업로드를 하는 경우 일반적으로 Blob type의 field를 추가해서 넣는데 조금은 의외적인 방법이군요. 그냥 blob에 넣는게 어떤가요? 괜한 자원낭비가 아닐까 생각하는데요.
md5 알고리즘이 그리 빠른함수도 아니고 말이죠. -
플로렐라
2004.07.03 13:05
파일을 디비에 올리면 용량의 압박이;;; -
대류
2004.07.04 22:06
저는 PHP 에 관해 아는건 없습니다.....
경험상 제로보드에는 비슷한 이름의 파일이 업로드되면 자동으로 폴더가 생기고 그 안에 파일이 들어가는 것 같더군요...
페리님의 소스를 응응하면 그런 현상을 어느정도 막을수도 있을 것 같은데요..
파일업로드시 a~z 까지를 랜덤으로 두개를 파일명 앞에 붙이면 되지 않을까요?
예를 들어 korea.gif 라는 파일이 있는데 같거나 비슷한 파일이 이미 있을 경우
ackorea.com / azkorea.com 이런식으로 앞에 알파벳등의 기호가 랜덤으로 붙는 것 말입니다.
제 생각이 잘못된 건가요?
맞는거라면 우찌할 수있는지 좀 알려주시면 감사하겠습니다. -
토끼군
2004.07.05 13:49
파일 이름은 그대로 저장하되, db 쿼리 한 번 때려서 얻을 수 있는 해쉬값을 파일 이름에 붙여서 저장하는 방법이 보통 일반적이지 않나요. 앳플군 님의 방법은 분명 좋긴 한데 md5의 부하가 좀 있을 것 같아서, 저는 timestamp-_-에 md5를 적용하는 편입니다;;; -
Pe-i
2004.07.10 15:44
저는 귀찮아서[?] 중복되는 파일이 있다면
$file_name = date("YmdHis").$file_name;
으로 처리해버린다죠;;; -
SyaKu
2004.09.14 21:54
Pe-i // 우왕~ 난 왜 저생각을 못했을까;; n,.n
아주 만약에 똑같은 때에 똑같은 파일을 두사람이 올리면^^;;
제목 | 글쓴이 | 날짜 |
---|---|---|
rand함수와 mt_rand함수의 비교 [6] | 심심타 | 2004.07.30 |
트랙백 구현하기 - 4. PHP로 트랙백 핑 받기 | TheMics | 2004.07.18 |
트랙백 구현하기 - 3. PHP로 트랙백 핑 보내기 [4] | TheMics | 2004.07.18 |
히어닥 문법 활용 [14] | ☺심심 | 2004.07.13 |
++와 +=1 의 속도차이 [7] | 플로렐라 | 2004.07.12 |
<와 <=의 속도차이? [23] | 플로렐라 | 2004.07.07 |
서버가 느려졌을경우... [20] | 신상우 | 2004.06.28 |
파일업로드시 파일명 중복되지 않게 저장하기.. [8] | 페리 | 2004.06.28 |
페이지에 암호를 걸자..=_= [27] | ☺심심 | 2004.06.25 |
아이피 접근을 막고 메세지 출력하기.. [11] | ☺심심 | 2004.06.24 |
오늘의 명언을 출력해주는 함수 [10] | 김재경 | 2004.06.15 |
3. if문 [13] | 티다 | 2004.06.05 |
응용편 - BMI 측정 테스트 소스를 만들어보자 [5] | 티다 | 2004.06.04 |
게시판내용에 코멘트를 달자!! -마지막- [2] | 이혁 | 2004.06.03 |
게시판내용에 코멘트를 달자!! -2- [1] | 헉스 | 2004.06.02 |
게시판내용에 코멘트를 달자!! [3] | 헉스 | 2004.06.02 |
2. array [5] | 티다 | 2004.06.02 |
1. 연산자 [2] | 티다 | 2004.06.02 |
주식정보출력코드 [2] | 김재경 | 2004.06.01 |
윈도우계정에서 현재 남은 용량과 DB 용량 알기 [6] | 지으니 | 2004.05.31 |
원본파일명을 이용하지 않고 임의의 파일로 저장했다가 원본 파일명은 db에 저장해서 보내줄때 down.php 같은 파일을 거쳐서 발송하는 경우 이런 방식으로 하면 파일이 겹치지 않게 할 수 있으나 파일의 관리가 불편하고 db를 통하지 않으면 파일을 알 수 없다는 단점이 생기죠.
또 파일마다 글 단위로 폴더를 unix time stamp 형식의 폴더를 만들면서 저장하는 방식인데 이 방식은 과다한 disk를 사용하고 관리자가 임의로 찾아서 지우려면 상당히 골치가 아프다는 단점이 있습니다.(linux 같은경우 설정에 따라서 directory당 4k byte의 disk 공간을 가진다고 하더군요.)
위와 같은경우의 대안도 상당히 좋은 방법이지만 여러번 중복되다보면 n_n_n_n_..... 이런 이상한 꼴로 파일명이 비대하게 커지는 경우가 발생합니다.
Regular expression을 이용해서 패턴을 지정해 예를 들어 () 괄호안에 숫자를 넣어 숫자를 증가시키도록 루틴을 넣는다면 상당히 적합한 알고리즘이 나오지 않을까 생각되네요.
제가 생각하는 파일명칭 방식이었습니다. 테클이라고는 생각하지 말아주세요 ^^;