2013年7月5日金曜日

[PHP]投稿された画像を圧縮してmySQLに保存する方法

iPhoneから送信された画像を保存する仕組みを作っていたので、サーバーサイドの処理をまとめておきます。

iPhoneから画像を送信する方法は次回の記事に載せておきます。

name="image"
の形式で送信された画像を保存する方法です。

DBのテーブルは
id            int(11)  auto_increment
mime      varchar(50)
image     mediumblob
ってかんじです。


//アップロードされた画像は$_FILE['image']でアクセスできます
if($_FILES['image']['error']){

 exit;
}
 

$mime = $_FILES['image']['type'];          //画像のmime(image/jpegなど)を取得
$path = $_FILES['image']['tmp_name']; //アップロードされた一時ファイルへのパスを取得

if($mime == 'image/pjpeg') $mime  = 'image/jpeg';
if($mime == 'image/x-png') $mime  = 'image/png';

$imginfo = getimagesize($path); //画像情報の取得
if($imginfo[2] == IMAGETYPE_JPEG || $imginfo[2] == IMAGETYPE_GIF || $imginfo[2] == IMAGETYPE_PNG){
 
        //画像データの取得
        if($mime == 'image/png')
  $image = imagecreatefrompng($path);
 else if($mime == 'image/jpeg')
  $image = imagecreatefromjpeg($path);
 
        $width = $imginfo[0];     //0:widthを取得
 $height= $imginfo[1];     //1:heightを取得
 
 $newWidth = 240;
 $rate = $newWidth / $width;
 $newHeight = $rate*$height;
 
 global $newImage;
 $newImage = imagecreatetruecolor($newWidth, $newHeight);
 
        //リサイズして$newImageに保存 imagecopyresizedよりも効率がいいらしい
 imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
 //imagejpeg($newImage,"./files/tmp.jpeg",100);
 
        //jpeg形式で一時ファイルに保存(100の部分は品質。75がデフォルト値)
        imagejpeg($newImage,$_FILES['image']['tmp_name'],100);
}

if(is_uploaded_file($path)){
 $mime = 'image/jpeg';
 
 $mime = addslashes($mime);
 
        //圧縮画像データの取得
        $data = addslashes(file_get_contents($path));
 
 //DBに格納
 $sql = "insert into image (mime, image) values ('$mime', '$data')";
 mysql_query($sql) or die(mysql_error());
 

 
}
こんな感じでDBに画像を保存できます。
iPhoneからの投稿はまた次回〜