관리 메뉴

웹개발자의 기지개

이미지 리사이징해서 이미지파일 업로드하기 2 [간편 함수만들기] 본문

PHP

이미지 리사이징해서 이미지파일 업로드하기 2 [간편 함수만들기]

http://portfolio.wonpaper.net 2019. 2. 9. 20:01

앞전 포스팅글 1편에서 이미지 크기를 리사이징해서 파일 업로드 되는 실제적인 구조내용은 미리 올려놓았다.

 

이번에는 좀더 실무에 간편하게 쓸수 있게끔 이를 함수화해 보도록 하자.

 

먼저, 함수 파일이다.

 

 

// 이미지 업로드 기본함수
function uploadImage($uploadSaveDir,$uploadFileArr, $per=80) {

 

 //$uploadSaveDir : 업로드할 화일경로
 //$uploadFileArr : 업로드할 화일 배열
 //$per           : 줄여줄 이미지 비율퍼센트 - 100 이면 실제이미지 그대로 100%, 80이면 80% , 기본값으로 80%으로 지정

 

 // usage : 이 함수를 이용하기 위해서는 form의 ENCTYPE="multipart/form-data" 으로 주고,
 //       : <input type="file" name="userfile"> 이런식으로 각 화일을 배열처리 할수 있도록 폼을 만든다.
 //       : uploadImage("업로드될 화일디렉토리명",$_FILES[업로드되는 화일명], 리사이징 되는 비율)
 // ex )    $save_dir  = '../pds/person';
 //     $filename1 = uploadImage($save_dir,$_FILES[userfile1])
 //     $filesize1 = $_FILES[userfile1][size];

 

 // $_FILES[userfile1][name] -  업로드 화일명
 // $_FILES[userfile1][size] -  화일 사이즈

 

  $uploaded_file_name = "";

  $uploaded_file = $uploadFileArr[tmp_name];

  if (strcmp($uploaded_file,"none") && $uploaded_file) {

   $uploaded_file_name = $uploadFileArr[name];
   
   // ".." 나 "/" , "|" 가 삽입된 파일명 금지
   if ($uploadFileArr[name]) {
    if (eregi( "\\\\|\.\.|/", $uploadFileArr[name])) {
     echo "<script language='javascript'>alert('특수문자( .. , / , | ) 가 삽입된 파일명은 업로드가 불가능합니다.');history.back();</script>";
     exit;
    }
   }

   $uploaded_file_nameArr = explode(".",$uploaded_file_name);
   $extension      = $uploaded_file_nameArr[sizeof($uploaded_file_nameArr)-1];

      $ext = array_pop(explode('.', strtolower($uploadFileArr[name])));
      $allowed_ext = array('jpg','jpeg','png','gif');


   if( !in_array($ext, $allowed_ext) ) {
    echo "<script type='text/javascript'>alert('허용되지 않는 확장자입니다.');</script>";
    exit;
   }

 

   $file_array = explode(".", $uploaded_file_name);            
   $time = explode(" ", microtime());            
   $uploaded_file_name  = $time[1];            //(microtime)            
//   $uploaded_file_name .= "_" . str_replace('%', '', urlencode($file_array[0])); //업로드 되는 실제 생성되는 파일명  


   $randNum = rand(0, 3250);
   $uploaded_file_name .= "_" . $randNum;           //업로드 되는 실제 생성되는 파일명  
   $uploaded_file_name .= ".".$file_array[sizeof($file_array)-1];     //(확장자)

   // 화일이 이미 존재하는지 체크한다.
   $dest = $uploadSaveDir . "/" . $uploaded_file_name;

   $n=0;
   $orgFileName = substr($uploaded_file_name,0,strrpos($uploaded_file_name,"."));
   $tempFileName = "";

   if (file_exists($dest)) {
    while (file_exists($dest)) {  
    
    $n++;
    $tempFileName = $orgFileName . "(" . $n . ")";
    if ($extension) {
     $tempFileName = $tempFileName . "." . $extension;
    }
    $uploaded_file_name = $tempFileName;
    $dest = $uploadSaveDir . "/" . $uploaded_file_name;
    }
   }

   $url = $uploadSaveDir . "/". $uploaded_file_name;


   // 이미지 압축하여 줄이기
   $filename = compress_image($uploadFileArr[tmp_name], $url, $per);
   // 버퍼이용
   $buffer = file_get_contents($url);

 

/*
   // 파일 정보 출력
   echo "파일 정보
    파일명: $name
    확장자: $ext
    파일형식: {$_FILES['mainImgInput']['type']}
    파일크기: {$_FILES['mainImgInput']['size']} 바이트
    url: {$url}
    filename: {$filename}
    ";
*/

  }
  return $uploaded_file_name;
}

 

// 이미지 파일 압축시키는 함수
function compress_image($source, $destination, $quality) {
 $info = getimagesize($source);
 if ($info['mime'] == 'image/jpeg')
  $image = imagecreatefromjpeg($source);
 elseif ($info['mime'] == 'image/gif')
  $image = imagecreatefromgif($source);
 elseif ($info['mime'] == 'image/png')
  $image = imagecreatefrompng($source);
 imagejpeg($image, $destination, $quality);
 imagedestroy($image);
 return $destination;
}

 

 

자아 ~ 함수는 준비되었다.

 

실제로 이용해 보도록 하자.

 

[이미지 업로드 페이지] - 하단부에 ajax 형태로 업로드했다. (이전 포스팅의 글을 참고바란다.)

 

 

<form name="fphoto" id="fphoto" method="post" enctype="multipart/form-data">
 <input type="file" id="userfile1" name="userfile1" style="width:220px;"><input type="button" id="photoBtn" value="올리기" style="width:50px;">
 <div class="title roboto" style="padding:8px 0;">( JPG, PNG, GIF확장자 , 200px X 200px 추천 )</div>
</form>

 

<script>

$("#photoBtn").on('click',function(e){

 e.preventDefault();

 

 var val = $("#userfile1").val();
 if (!val) {
  $(".title.roboto").html("이미지 파일을 선택하여 주십시오.");
  $("#userfile1").focus();
  return false;
 }

 var fd = new FormData($("#fphoto")[0]);
 fd.append("userfile1",$("input[name=userfile1]")[0].files[0]);

 $.ajax({
  type: "post",
  url: "ajax_profileImgChg.php",
  data: fd,
  processData: false,
  contentType: false,
  success: function(data,status,xhr) {
   alert("프로필 사진이 정상적으로 변경되었습니다.");
   window.location.reload(true);
//   alert(data);
  },
  error: function(xhr,status,error) {
   $(".title.roboto").html("사진 업로드시 Error 발생");
  }
 });
});

 

</script>

 

 

 

[이미지 업로드 처리 파일 - ajax_profileImgChg.php]

 

$save_dir = '../pds/person';
$filename1 = uploadImage($save_dir,$_FILES[userfile1],60);

$filesize1 = $_FILES[userfile1][size];

 

// filename1 = 새로 업로드된 파일명 ( ex) 1232223_22214.jpg  )

// filesize1 = $_FILES[userfile1][size] 이런식으로 파일사이즈

// $_FILES[userfile1][name] 은 원래의 이미지 파일명이다.

 

 

간편하게 이용할 수 있다.

 

다음 그림은 업로드된 결과 이미지 파일명이다.

 

 

 

 

Comments