<?
/***************************************************************
프로그램명 : filedownload_zip.php
설명 : 파일 여러개 zip 파일로 묶어서 받기
작성일자 : 2005-10-06 오후 1:58
작성자 : 윤영식
***************************************************************/
// 에러 메시지 뿌리고 history.back()
function error($msg) {
echo "<script language=\"javascript\">\r\n";
echo " alert(\"".$msg."\");\r\n";
echo " history.back();\r\n";
echo "</script>";
exit();
}
// 디렉토리 통째로 삭제하기....
function rm($fileglob) {
if (is_string($fileglob)) {
if (is_file($fileglob)) {
return unlink($fileglob);
} else if (is_dir($fileglob)) {
$ok = rm("$fileglob/*");
if (! $ok) {
return false;
}
return rmdir($fileglob);
} else {
$matching = glob($fileglob);
if ($matching === false) {
trigger_error(sprintf('No files match supplied glob %s', $fileglob), E_USER_WARNING);
return false;
}
$rcs = array_map('rm', $matching);
if (in_array(false, $rcs)) {
return false;
}
}
} else if (is_array($fileglob)) {
$rcs = array_map('rm', $fileglob);
if (in_array(false, $rcs)) {
return false;
}
} else {
trigger_error('Param #1 must be filename or glob pattern, or array of filenames or glob patterns', E_USER_ERROR);
return false;
}
return true;
}
// 업로드 파일 디렉토리
$up_path = "../upload";
$zip_dir = "../upload/tmp_zip";
// tmp 디렉토리 만들기 위해서 file_dir 만들기
$tmp = microtime();
$tmp2 = explode(" ",$tmp);
$file_dir = $tmp2[1].sprintf("%03d",(int)($tmp2[0]*1000));
$tmp=null;
$tmp2=null;
// tmp 디렉토리
$tmp_dir = $zip_dir."/".$file_dir;
// tmp 디렉토리 생성
if(!mkdir ($tmp_dir, 0700)) {
error("파일 생성시 에러가 발생했습니다.");
exit;
}
$sql = "SELECT id, filename FROM table";
$result = mysql_query($sql);
$i=0;
while($row = mysql_fetch_assoc($result)) {
$org_name = "/".$row[file_name];
$new_name = "/".$id."_".$row[file_name];
// tmp 디렉토리로 COPY
@copy($up_path.$org_name,$tmp_dir.$new_name);
$i++;
}
mysql_free_result($result);
mysql_close();
if (!$i) {
rm($tmp_dir);
error("선택된 파일이 없습니다.");
exit;
}
// zip 으로 묶기
// zip 경로는 서버에서 which zip 을 통해서 알아낸다.
@exec("/usr/bin/zip ".$tmp_dir."/".$file_dir.".zip ".$tmp_dir."/*");
// 다운로드 받기
if( $fp = @fopen( $tmp_dir."/".$file_dir.".zip","r")) {
Header("Content-type: file/unknown");
Header("Content-Disposition: attachment; filename=".$file_dir.".zip");
Header("Content-Description: PHP3 Generated Data");
while ($data=fread($fp, filesize( $tmp_dir."/".$file_dir.".zip"))){
print($data);
}
} else {
error("서버에 자료파일이 없습니다.");
}
// 임시로 만들어진 모든 데이터 지우기, 단, 사용자가 취소를 누르면 서버상에 임시데이터가 지워지지 않으니 cron 을 통해 하루에 한번씩 지워주면 된다.
rm($tmp_dir);
exit;
?>
출처
http://wizard.ncafe.net/wt/?id=all&start=0&no=38&tag=%B4%D9%BF%EE%B7%CE%B5%E5&v_date=&que=