ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

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からの投稿はまた次回〜

2013年1月23日水曜日

iPhoneでXMLファイルからデータを取得する

サーバーからデータ取得してiPhoneで使用したい場合はXML形式で読み込むようにしています。
このやり方が正しいのかイマイチわからないのが1人で作業するとこの難しさだと感じてます。
だれか正攻法教えてください。

まずはサーバー側ではPHPでXML形式のデータを作成。

createXML.php
&lt?php
include_once "DatabaseClass.php";

if(!empty($_POST)){  
 $database = new Database;
 
 $table = "user_name";
 $email = $_POST['email'];
 $password = $_POST['password'];
 
 $select = sprintf('SELECT id, name, picture FROM %s WHERE email="%s" AND password="%s"',
      mysql_real_escape_string($table),
      mysql_real_escape_string($email),
      mysql_real_escape_string($password));
           
 $row = $database->array_select($select);

 if($row != NULL){
  $xml = "\n";
     
  $xml.= '';
  $xml.="\n";
     
   foreach($row as $value){
    $xml.="\n";
    $id=$value["id"];
    $xml.="\t$id\n";
    $name=$value["name"];
    $xml.="\t$name\n";
    $pict=$value["picture"];
    $xml.="\t$pict\n";
    $xml.="\n";
   }//foreach
     
   $xml.="\n";
   echo $xml; 
 } //if($row != NULL)
 
 $database->close();
}


?>

iPhoneからはPOSTメソッドでデータを送信し、返り値をNSXMLParserオブジェクトに代入してデータを取得する。

XMLParseAppDelegate.m
- (void)loadData{   
    NSURL *url = [[NSURL alloc]initWithString:@"http://localhost:8888/createXML.php"];
 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url];
    
    // MethodにPOSTを指定する。
    request.HTTPMethod = @"POST";
    
    NSString *email    = @"momo@momochibi.com";
    NSString *password = @"momo";
    
    NSString *body = [NSString stringWithFormat:@"email=%@&password=%@",email,password];
    
    request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];

    //XML形式のデータを取得   
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:returnData];
  [parser setDelegate:self];
    [parser parse];
}

// XMLのパース開始
- (void)parserDidStartDocument:(NSXMLParser *)parser {
 // 初期化処理
 //statuses = [NSMutableArray array];
    
    members = [NSMutableArray array];
    membersPicture = [NSMutableArray array];
    
    inIdElement   = NO;
    inNameElement = NO;
    inPictElement = NO;
    
}

// XMLのパース終了
- (void)parserDidEndDocument:(NSXMLParser *)parser {
 // 取得したデータを出力する
 for (NSString *member in members) {
  NSLog(@"%@", member);
 }
}

// 要素の開始タグを読み込み
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
 if ([elementName isEqualToString:@"id"]) {
  // nameタグの中に入った
  inIdElement = YES;
        ID = [NSMutableString string];
 }
    
    if ([elementName isEqualToString:@"name"]){
        inNameElement =YES;
        name = [NSMutableString string];
    
    }
    
    if( [elementName isEqualToString:@"pict"] ){
        inPictElement = YES;
        pict = [NSMutableString string];
    }
    
}

// 要素の閉じタグを読み込み
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
 if ([elementName isEqualToString:@"member"]) {
  // memberタグが終わるタイミングで、membersにメンバーを追加する
  NSString *s = [NSString stringWithFormat:@"%@: %@ : %@", ID, name, pict];
  [members addObject:s];
        
        NSString *ps = [NSString stringWithFormat:@"%@",pict];
        [membersPicture addObject:ps];
 } else if ([elementName isEqualToString:@"id"]) {
  // idタグから出た!
  inIdElement = NO;
 } else if ([elementName isEqualToString:@"name"]) {
  // nameタグから出た!
  inNameElement = NO;
 } else if ([elementName isEqualToString:@"pict"]) {
        
        inPictElement = NO;
    }
}

// テキストデータ読み込み
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
 // テキストデータは複数回に分けて呼び出されることがある
 if (inIdElement) {
  [ID appendString:string];
 }
    else if (inNameElement) {
  [name appendString:string];
 }
    else if (inPictElement){
        [pict appendString:string];
    }

}
XMLParseAppDelegate.h
#import &ltoundation/Foundation.h&gt

@interface XMLParseAppDelegate : NSObject&ltUIApplicationDelegate, NSXMLParserDelegate&gt
{
 
    NSMutableArray *members;
    BOOL inIdElement;
    BOOL inNameElement;
    BOOL inPictElement;
    NSMutableString *name;
    NSMutableString *ID;
    NSMutableString *pict;
}

- (void)loadData;


@end
こんな感じでデータをiPhoneからデータベースに接続して データを取得したりしてます。