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