알아두어야 할 내용:$_FILES[][]
- HTML 폼에서 <input type="file" id="userfile" .....>를 사용한 파일에 대한 정보를 가지고 있음
- register_globals(php.ini 파일에 들어있는 변수값)가 off일때 꼭 사용해야 함
- $_FILES['userfile']['tmp_name']- 웹 서버에 임시로 저장된 파일의 위치.
- $_FILES['userfile']['name'] - 사용자 시스템에 있을 때의 파일 이름.
- $_FILES['userfile']['size'] - 파일의 바이트 크기.
- $_FILES['userfile']['type'] - 파일의 MIME 타입을 가리킴. (예:text/plain이나 image/gif 등)
- $_FILES['userfile']['error'] - 파일 업로드할 때 일어난 오류 코드를 알려줌
예제
input.php(입력폼)
---------------------------------------------------------------------------------------
<form method="post" enctype="multipart/form-data" action="save.php">
........
<div id="pimage"><p>이미지:<input type="file" name="uimg" id="textfield" />(이미지사이즈 : 168 X 115)</div>
.........
</form>
---------------------------------------------------------------------------------------
save.php(저장폼)
---------------------------------------------------------------------------------------
<?php
$img_dir = $_SERVER['DOCUMENT_ROOT']."/저장할디렉토리명"; //저장 디렉토리
$img_tmp = $_FILES['uimg']['tmp_name']; //임시 파일명
$img_type = $_FILES['uimg']['type']; //저장가능 이미지 타입
$img_name = $_FILES['uimg']['name']; //파일명(ex : xxxx.jpg)
$filename = explode(".",$img_name); //파일명 및 확장자를 분리한 배열
$extension = strtoupper($filename[sizeof($filename)-1]); //확장자 추출
//타임 및 난수를 이용해서 기존 파일명 대신 사용할려고 함
srand((double)microtime() * 1000000); //난수만들기(seed 초기화)
$random = sprintf('%03d',rand(1,999)); //난수만들기
$up_filename = time()."_".$random.".".strtolower($extension); //DB저장 파일명
$save_name = $img_dir."/".$up_filename; //copy시 전체경로 및 파일명
//파일 확장자로 올릴 수 있는 파일 체크함
if($extension == "JPG" || $extension == "GIF") {
} else {
echo("
<script>
window.alert('지원 가능하지 않는 파일입니다. \\n이미지를 입력하여 주세요.');
history.go(-1);
</script>
");
exit;
}
if(copy($img_tmp, $save_name)) { //파일 업로드
unlink($img_tmp); //임시파일삭제
}
else {
unlink($img_tmp);
echo("
<script>
window.alert('파일 저장시 오류가 발생하였습니다.\\n감사합니다.');
history.go(-1);
</script>
");
exit;
}
참고 : http://sexy.pe.kr/tc/92
[PHP] 폼 파일 업로드, DB 업로드 파일저장, 업로드 절차 예제로 보기
* 파일업로드 폼전송 소스 (upload_form.htm)
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8;" /> <title>파일업로드 하기</title> </head> <body> <!--폼파일 전송모드--> <form enctype="multipart/form-data" action="image_save.php" method="post"> <fieldset><legend>파일업로드</legend> <!--업로드 용량제한: 5M --> <input type="hidden" name="MAX_FILE_SIZE" value="5242880" /> <input type="hidden" name="mode" value="upload" /> <input type="file" name="upload" /> </fieldset> <p><input type="submit" value="업로드 시작" /></p> </form> </body> </html>
* 이미지 저장 소스 (image_save.php)
<?//PHP 5.2.5, 작성: sysop@sexy.pe.kr header("Content-Type: text/html; charset= UTF-8 "); //현재 업로드 상태인지를 체크 if($_POST['mode'] == 'upload') { //1. 업로드 파일 존재여부 확인 if(!isset($_FILES['upload'])) { exit("업로드 파일 존재하지 않음"); }//if //2. 업로드 오류여부 확인 if ($_FILES['upload']['error'] > 0) { switch ($_FILES['upload']['error']) { case 1: exit("php.ini 파일의 upload_max_filesize 설정값을 초과함(업로드 최대용량 초과)"); case 2: exit("Form에서 설정된 MAX_FILE_SIZE 설정값을 초과함(업로드 최대용량 초과)"); case 3: exit("파일 일부만 업로드 됨"); case 4: exit("업로드된 파일이 없음"); case 6: exit("사용가능한 임시폴더가 없음"); case 7: exit("디스크에 저장할수 없음"); case 8: exit("파일 업로드가 중지됨"); default: exit("시스템 오류가 발생"); } // switch }//if //3. 업로드 제한용량 체크(서버측에서 5M로 제한) if($_FILES['upload']['size'] > 5242880) { exit("업로드 최대용량 초과"); }//if //4. 업로드 허용 확장자 체크(보편적인 jpg,jpeg,gif,png,bmp 확장자만 필터링) $ableExt = array('jpg','jpeg','gif','png','bmp'); $path = pathinfo($_FILES['upload']['name']); $ext = strtolower($path['extension']); if(!in_array($ext, $ableExt)) { exit("허용되지 않는 확장자입니다."); }//if //5. MIME를 통해 이미지파일만 허용(2차 확인) $ableImage = array('image/jpeg', 'image/JPG', 'image/X-PNG', 'image/PNG', 'image/png', 'image/x-png', 'image/gif','image/bmp','image/pjpeg'); if(!in_array($_FILES['upload']['type'], $ableImage)) { exit("지정된 이미지만 허용됩니다."); }//if //6. DB에 저장할 이미지 정보 가져오기(width,height 값 활용) $img_size = getimagesize($_FILES['upload']['tmp_name']); //DB연결 $db = @new mysqli('localhost','id','password','dbname'); if(mysqli_connect_errno()) { exit("DB연결오류"); }//if
//do~while: 새로만든 파일명이 중복일경우 반복하기 위한 루틴 do{ //6. 새로운 파일명 생성(마이크로타임과 확장자 이용) $time = explode(' ',microtime()); $fileName = $time[1].substr($time[0],2,6).'_'.strtoupper($ext); //중요 이미지의 경우 웹루트(www) 밖에 위치할 것을 권장(예제 편의상 아래와 같이 설정) $filePath = $_SERVER['DOCUMENT_ROOT'].'/uploads/'; //7. 생성한 파일명이 DB내에 존재하는지 체크 $query = sprintf("SELECT no FROM file_list WHERE db_filename = '%s'",$fileName); $result = $db->query($query); //생성한 파일명이 중복하는 경우 새로 생성해서 체크를 반복(동시저장수가 대량이 아닌경우 중복가능 희박) }while($result->num_rows > 0); //db에 저장할 정보 가져옴 $upload_filename = $db->real_escape_string($_FILES['upload']['name']); $file_size = $_FILES['upload']['size']; $file_type = $_FILES['upload']['type']; $upload_date = date("Y-m-d H:i:s"); $ip = $_SERVER['REMOTE_ADDR']; //오토커밋 해제 $db->autocommit(false); //8. db에 업로드 파일 및 새로 생성된 파일정보등을 저장 $query = sprintf("INSERT INTO file_list (upload_filename,db_filename,file_path,file_size,file_type,upload_date,ip,width,height) VALUES ('%s','%s','%s',%d,'%s','%s','%s',%d,%d)", $upload_filename, $fileName, $filePath, $file_size, $file_type, $upload_date, $ip,$img_size[0],$img_size[1]); $db->query($query); //DB에 파일내용 저장 성공시 if($db->affected_rows > 0) { //9. 업로드 파일을 새로 만든 파일명으로 변경 및 이동 if (move_uploaded_file($_FILES['upload']['tmp_name'], $filePath.$fileName)) { //10. 성공시 db저장 내용을 적용(커밋) $db->commit(); echo "업로드 성공"; }else{ //실패시 db에 저장했던 내용 취소를 위한 롤백 $db->rollback(); exit("업로드 실패"); }//if }//if }//if ?>
'개발도구 > iOS - 아이폰 개발' 카테고리의 다른 글
[아이폰] CLLocationDegrees < - > NSString (0) | 2012.05.25 |
---|---|
[아이폰] Google Geocoding API (0) | 2012.05.25 |
[아이폰] IOS 카메라 기능 .. overlay 해서 보여주기 (0) | 2012.05.22 |
[아이폰] storyboard identifier (0) | 2012.05.15 |
[아이폰] 블로그 강의 펌 (0) | 2012.05.15 |