UIImageの画像を自前のシステムにアップロード
UIImageの画像を、自前のシステムにHTTPでアップロードする処理を作ってみました。
iOSのカメラ(UIImagePickerController)を試してみた - おかひろの雑記
と組み合わせれば、カメラで撮影した画像をアップロードできます。
アップロードする画像はUIImageViewに表示されているものとします。
// 画像をアップロード - (IBAction)uploadButtonTouched:(id)sender { NSString *urlString = @"http://www.example.com/uploadImage/"; // 画像をNSDataに変換 //NSData *imageData = [[[NSData alloc]initWithData:UIImagePNGRepresentation(self.pictureImage.image)] autorelease]; NSData *imageData = [[[NSData alloc]initWithData:UIImageJPEGRepresentation(self.pictureImage.image, 0.5)]autorelease]; // 送信データの境界 NSString *boundary = @"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // アップロードする際のパラメーター名とファイル名 NSString *uploadName = @"uploadFile"; NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc]init]autorelease]; [dateFormatter setDateFormat:@"yyyyMMddHHmmss"]; NSString *uploadFileName = [dateFormatter stringFromDate:[NSDate date]]; // 送信するデータ(前半) NSMutableString *sendDataStringPrev = [NSMutableString stringWithString:@"--"]; [sendDataStringPrev appendString:boundary]; [sendDataStringPrev appendString:@"\r\n"]; [sendDataStringPrev appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.jpg\"\r\n",uploadName,uploadFileName]]; [sendDataStringPrev appendString:@"Content-Type: image/jpeg\r\n\r\n"]; // 送信するデータ(後半) NSMutableString *sendDataStringNext = [NSMutableString stringWithString:@"\r\n"]; [sendDataStringNext appendString:@"--"]; [sendDataStringNext appendString:boundary]; [sendDataStringNext appendString:@"--"]; // 送信データの生成 NSMutableData *sendData = [NSMutableData data]; [sendData appendData:[sendDataStringPrev dataUsingEncoding:NSUTF8StringEncoding]]; [sendData appendData:imageData]; [sendData appendData:[sendDataStringNext dataUsingEncoding:NSUTF8StringEncoding]]; // リクエストヘッダー NSDictionary *requestHeader = [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"%d",[sendData length]],@"Content-Length", [NSString stringWithFormat:@"multipart/form-data;boundary=%@",boundary],@"Content-Type",nil]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]]; [request setAllHTTPHeaderFields:requestHeader]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:sendData]; [NSURLConnection connectionWithRequest:request delegate:self]; }
サーバー側は"uploadFile"というパラメーター名でデータを受け取るようにしています。
// 受け取ったレスポンス -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if(httpResponse.statusCode == 200) { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"完了" message:@"画像をアップロードしました" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; } else { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"エラー" message:@"ネットワークエラー" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; } } // 受け取ったデータ -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } // エラーが発生した場合 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"エラー" message:@"ネットワークエラー" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; }
もっとうまいやり方や、便利なライブラリがあるかもしれません。
2012/10/30 追記
GitHubにサンプルプログラムを載せました。
GitHub - okahiro/CameraPictureUpload