php simple-code
php image uploader 이미지 업로더
폼태그 구성
- image_index.php
<form action="image_uploader.php" method="post" enctype="multipart/form-data">
<!--action: 전송타겟/method: 전송방식/enctype: 엔코딩 타입 (multipart/form-data 멀티파일 전송방식)-->
<input type="file" name="file1" id="file1"/><br />
<input type="submit" value="업로드"/>
</form>
극 간단 전송 PHP
<?php
$name = $_POST['name'];
$image_name = $_FILES['image']['name']; //이미지 이름
$image_tmp = $_FILES['image']['tmp_name']; //임시 이미지가 저장되는 경로
$image_target = './original/'.$image_name;
move_uploaded_file( $image_tmp, $image_target);
?>
- 파일 업로드 요청하면 tmp에 일단 저장되는데 그 파일을 move_upload_file함수를 이용하여 원하는 위치로 이동시키는 방식
전송용 PHP
- image_uploader.php
<?php
$GLOBALS['img_width'] = 1920; //3840
$GLOBALS['img_height'] = 1080; //2160
$GLOBALS['thumb_width'] = $GLOBALS['img_width']/10;
$GLOBALS['thumb_height'] = $GLOBALS['img_height']/10;
function file_upload($id){
if(isset($_FILES[$id])){
if($_FILES[$id]["error"] > 0) {
//에러가 있는지 검사하는 구문
echo "Error:".$_FILES[$id]["error"]."<br />";
}else{
echo "upload:".$_FILES[$id]["name"]."<br />";
echo "type:".$_FILES[$id]["type"]."<br />";
echo "size:".$_FILES[$id]["size"]."<br />";
echo "stored in:".$_FILES[$id]["tmp_name"]."<br />";
//에러가 없다면 파일 정보 출력
if(file_exists("./file_folder/".$id.".jpg")){//동일한 파일이 있음
unlink("./file_folder/".$id.".jpg");
}
if(file_exists("./file_folder/".$id."_thumb.jpg")){//동일한 파일이 있음
unlink("./file_folder/".$id."_thumb.jpg");
}
//move_uploaded_file($_FILES[$id]["tmp_name"], "./file_folder/".$_FILES[$id]["name"]);
//4k (3840*2160);
cropImage($GLOBALS['img_width'],$GLOBALS['img_height'],$_FILES[$id]["tmp_name"],$_FILES[$id]["type"],"./file_folder/".$id);
}
}
}
for($i=1; $i<=5; $i++){
file_upload("file".$i);
}
function cropImage($nw, $nh, $source, $stype, $dest) {
$size = getimagesize($source);
$w = $size[0];
$h = $size[1];
echo $w.":".$h;
switch($stype) {
case "image/gif":
$simg = imagecreatefromgif($source);
$background = imagecolorallocate($simg, 255, 255, 255);
imagecolortransparent($simg, $background);
break;
case "image/jpeg":
$simg = imagecreatefromjpeg($source);
break;
case "image/png":
$simg = imagecreatefrompng($source);
$background = imagecolorallocate($simg, 255, 255, 255);
imagecolortransparent($simg, $background);
imagealphablending($simg, false);
imagesavealpha($simg, true);
break;
default:
echo "지원하지 않는 확장자 입니다. (jpg, gif, png만 가능)"."<br />";
echo "파일 업로드를 종료합니다"."<br />";
return;
break;
}
$dimg = imagecreatetruecolor($nw, $nh);
$wm = $w/$nw;
$hm = $h/$nh;
$h_height = $nh/2;
$w_height = $nw/2;
$type = 0;
if($wm < $hm) {
$adjusted_width = $w / $hm;
$half_width = $adjusted_width / 2;
$int_width = $half_width - $w_height;
imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
} else if($wm > $hm) {
$adjusted_height = $h / $wm;
$half_height = $adjusted_height / 2;
$int_height = $half_height - $h_height;
imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
} else {
imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
}
imagejpeg($dimg,$dest.".jpg",100);
$thumb = imagecreatetruecolor($GLOBALS['thumb_width'], $GLOBALS['thumb_height']);
imagecopyresized($thumb, $dimg, 0, 0, 0, 0, $GLOBALS['thumb_width'], $GLOBALS['thumb_height'], $nw, $nh );
imagejpeg($thumb,$dest."_thumb.jpg",100);
echo "업로드가 완료되었습니다."."<br />";
}
$prevPage = $_SERVER['HTTP_REFERER'];
// 변수에 이전페이지 정보를 저장
header('location:'.$prevPage);
// 페이지 이동
?>
문제해결
Call to undefined function imagecreatefromjpeg()
- 원본출처: https://www.fun25.co.kr/blog/php-imagecreatefromjpeg-undefined-function/
- PHP 썸네일 생성등을 위해서 ImageCreateFromJPEG 함수 사용시
- PHP Fatal error: Call to undefined function imagecreatefromjpeg()
- 에러가 날 경우는 gd 라이브러리가 설치가 안 된 경우입니다.
# apt-get install php5-gd //옛날방식
# apt-get install php7.0-gd
- 우분투일 경우 위와 같이 php의 gd 라이브러리를 설치해 주면 됩니다.
failed to open stream: No such file or directory
- 원본출처: http://iam777.tistory.com/301
- php.ini 에 extension=php_gd2.dll 구문이 막혀 있으면 안된다.
- 확장 dir 정의 확인 필요. extension_dir = “개인 pc dir 정보” 경로 설정이 주석으로 안되어 있고 정상 설정되어 있으면 된다.
- 이런 경우 phpinfo() 로 확인하면 내용중에 gd 에서 지원하는 내용이 보이게 된다.
-
위 내용은 도움 안됨
- 서버라고 하는 컴퓨터 기준으로 root를 잡아야하는데, 서비스하는 웹서버 루트에서 부터 폴더명을 입력하여. 폴더 경로가 잘못되어 나오는 오류
failed to open stream: Permission denied
sudo chmod -R 777 [변경할 파일이나 디렉토리]