웹개발 - PHP 프로그램 개발 강의
글수 707
같은 제목으로 여러가지 팁이 올라와 있는거 같은데...
정말 간단한 방법이 있습니다.
PHP 함수중에 다음과 같은 함수가 있습니다.
tempnam ( string dir, string prefix)
기능은 특정 디렉토리에서 유일한 임시 파일이름을 만듭니다.
제로보드를 예로 들면 ($id 는 게시판아이디)
예를 들어서 tempnam("data/$id", "tmp_") 이렇게 입력하면,
data/$id/tmp_b20lmC
data/$id/tmp_PBjxzx
data/$id/tmp_cY30xB
...
이런 값들을 리턴하게 됩니다.
이렇게 하면 제로보드에서 파일 업로드시 중복파일 검사루틴이 필요 없게 되고, 필요없는 디렉토리 생성을 줄일수 있습니다.
정말 간단한 방법이 있습니다.
PHP 함수중에 다음과 같은 함수가 있습니다.
tempnam ( string dir, string prefix)
기능은 특정 디렉토리에서 유일한 임시 파일이름을 만듭니다.
제로보드를 예로 들면 ($id 는 게시판아이디)
예를 들어서 tempnam("data/$id", "tmp_") 이렇게 입력하면,
data/$id/tmp_b20lmC
data/$id/tmp_PBjxzx
data/$id/tmp_cY30xB
...
이런 값들을 리턴하게 됩니다.
이렇게 하면 제로보드에서 파일 업로드시 중복파일 검사루틴이 필요 없게 되고, 필요없는 디렉토리 생성을 줄일수 있습니다.
2004.08.06 19:48:10 (*.97.205.123)
대신에 파일을 다운로드 받거나 파일을 보여줄 때 (이미지나 swf 등등..) 를 따로 처리해 줘야 합니다.
그리고 기왕에 이름을 바꾸어 저장할 거면, md5_file 같은 함수로 파일 내용의 해쉬로 저장하고 카운트를 올리는 방법으로 HDD의 중복된 자료가 올라오는 것을 방지하는 방법도 추천할 만 합니다. (현재 제가 사용중입니다;)
그리고 기왕에 이름을 바꾸어 저장할 거면, md5_file 같은 함수로 파일 내용의 해쉬로 저장하고 카운트를 올리는 방법으로 HDD의 중복된 자료가 올라오는 것을 방지하는 방법도 추천할 만 합니다. (현재 제가 사용중입니다;)
2004.08.09 20:33:31 (*.221.72.51)
현재 제가 쓰고 있는 방식입니다.
--- lib.php 파일 중 일부분 ---
// 첨부자료 유무 체크
function ZF_Ex($kind, $filename,$zid) {
$exist_data = @mysql_query("SELECT ".$kind." FROM ".$zid." WHERE ".$kind." = '".$filename."'");
while($row = @mysql_fetch_row($exist_data))
if($row[0]==$filename) zecerror_a("이미 등록된 자료입니다.");
return 0;
}
// 첨부자료 체크 2004/06/14
function ZF_Check($file_tmp, $file_name, $filer) {
global $savedir;
$temp = explode(".",$file_name);
$size = sizeof($temp) - 1;
$front = str_replace(".".$temp[$size], "", $file_name);
$back = $temp[$size];
if(@eregi("\'",$front)||@eregi("\"",$front)||@eregi("\\",$front)) {
zecerror_a("<b>파일명 에러</b><br>파일명에 ', \", \\ 금지!");
}
if(eregi("inc",$back)||eregi("htm",$back)||eregi("php",$back)||eregi("asp",$back)||eregi("cgi",$back)||eregi("pl",$back)) {
zecerror_a("업로드 금지 확장자입니다.");
}
if(!file_exists($savedir.$file_name)) {
if(!is_uploaded_file($file = $file_tmp)||!move_uploaded_file($file, $savedir.$file_name)) {
zecerror_a("업로드 실패하였습니다.");
}
}
rename($savedir.$file_name, $savedir.$filer);
}
// 첨부자료명 강제변경 2004/06/14
function ZF_Change($file_name) {
$ftemp = explode(".",$file_name);
$ftsize = sizeof($ftemp) - 1;
$ftd = str_replace(".".$ftemp[$ftsize], "", $file_name);
$ftname = md5($ftd);
$filer = $ftname.".".$ftemp[$ftsize];
return $filer;
}
--- write_ok.php 파일 중 일부분 ---
$savedir = "data/".$id."/";
if($HTTP_POST_FILES['file1']) {
$upfile1 = "file1";
$file1_name = $HTTP_POST_FILES[$upfile1]['name'];
$file1_tmp = $HTTP_POST_FILES[$upfile1]['tmp_name'];
$file1_size = $HTTP_POST_FILES[$upfile1]['size'];
}
if($file1_name) {
if(!$_POST['d_file1'] && $zecmode=="modify") {
zecerror_a("기존 파일 #1 삭제를 체크하세요.");
} else {
@unlink($savedir.$ofile1r);
}
if(!ZF_Ex("file1", $file1_name, $zid)) {
$file1 = $file1_name;
$file1r = ZF_Change($file1);
ZF_Check($file1_tmp, $file1_name, $file1r);
}
} else {
if($_POST[d_file1]) {
unlink($savedir.$ofile1r);
$file1 = "";
} else {
$file1 = $ofile1;
$file1r = $ofile1r;
$file1_size = $ofile1s;
$file1d = $ofile1d;
}
}
$file1 = addslashes($file1);
최종적인 업로드파일관련 변수 $file1 에는 원래 파일명이 들어가죠.
하나만 업로드 가능한 방식이 아니라 간단히 추가시키면 무한대로 사용 가능하죠.
이렇게 보니까 엄청 조잡하게 됐군요-_-;
(왠지 저 소스도 비효율적으로 보이는군요-_-;)
주석 다는 버릇도 들여야 할 듯...
--- lib.php 파일 중 일부분 ---
// 첨부자료 유무 체크
function ZF_Ex($kind, $filename,$zid) {
$exist_data = @mysql_query("SELECT ".$kind." FROM ".$zid." WHERE ".$kind." = '".$filename."'");
while($row = @mysql_fetch_row($exist_data))
if($row[0]==$filename) zecerror_a("이미 등록된 자료입니다.");
return 0;
}
// 첨부자료 체크 2004/06/14
function ZF_Check($file_tmp, $file_name, $filer) {
global $savedir;
$temp = explode(".",$file_name);
$size = sizeof($temp) - 1;
$front = str_replace(".".$temp[$size], "", $file_name);
$back = $temp[$size];
if(@eregi("\'",$front)||@eregi("\"",$front)||@eregi("\\",$front)) {
zecerror_a("<b>파일명 에러</b><br>파일명에 ', \", \\ 금지!");
}
if(eregi("inc",$back)||eregi("htm",$back)||eregi("php",$back)||eregi("asp",$back)||eregi("cgi",$back)||eregi("pl",$back)) {
zecerror_a("업로드 금지 확장자입니다.");
}
if(!file_exists($savedir.$file_name)) {
if(!is_uploaded_file($file = $file_tmp)||!move_uploaded_file($file, $savedir.$file_name)) {
zecerror_a("업로드 실패하였습니다.");
}
}
rename($savedir.$file_name, $savedir.$filer);
}
// 첨부자료명 강제변경 2004/06/14
function ZF_Change($file_name) {
$ftemp = explode(".",$file_name);
$ftsize = sizeof($ftemp) - 1;
$ftd = str_replace(".".$ftemp[$ftsize], "", $file_name);
$ftname = md5($ftd);
$filer = $ftname.".".$ftemp[$ftsize];
return $filer;
}
--- write_ok.php 파일 중 일부분 ---
$savedir = "data/".$id."/";
if($HTTP_POST_FILES['file1']) {
$upfile1 = "file1";
$file1_name = $HTTP_POST_FILES[$upfile1]['name'];
$file1_tmp = $HTTP_POST_FILES[$upfile1]['tmp_name'];
$file1_size = $HTTP_POST_FILES[$upfile1]['size'];
}
if($file1_name) {
if(!$_POST['d_file1'] && $zecmode=="modify") {
zecerror_a("기존 파일 #1 삭제를 체크하세요.");
} else {
@unlink($savedir.$ofile1r);
}
if(!ZF_Ex("file1", $file1_name, $zid)) {
$file1 = $file1_name;
$file1r = ZF_Change($file1);
ZF_Check($file1_tmp, $file1_name, $file1r);
}
} else {
if($_POST[d_file1]) {
unlink($savedir.$ofile1r);
$file1 = "";
} else {
$file1 = $ofile1;
$file1r = $ofile1r;
$file1_size = $ofile1s;
$file1d = $ofile1d;
}
}
$file1 = addslashes($file1);
최종적인 업로드파일관련 변수 $file1 에는 원래 파일명이 들어가죠.
하나만 업로드 가능한 방식이 아니라 간단히 추가시키면 무한대로 사용 가능하죠.
이렇게 보니까 엄청 조잡하게 됐군요-_-;
(왠지 저 소스도 비효율적으로 보이는군요-_-;)
주석 다는 버릇도 들여야 할 듯...


