iOSからHTTP経由でファイルをサーバーにアップロードする方法

iOSからファイル(主に画像)をアップロードする方法がわからずに調べていました。

サンプルはいくつか発見したのですが、複数の画像のポストが出来なかったりして悶々としていました。

「やるしかない!」っと言うことで、オレオレクラスを使って今後も使い回せるようにしてみました。

サンプルコードは以下から。よろしければどうぞ。

github – HTTPFileUploadSample

使い方はこんな感じです。

「HTTPFileUpload.h」「HTTPFileUpload.m」をプロジェクトに追加

まずは、プロジェクトに上記のクラスを追加します。

追加したクラスを読み込む

「import」を使って読み込みます。

#import “HTTPFileUpload.h”

POSTする画像をインスタンス化する

POSTしたい画像をインスタンス化します。

UIImage *image1 = [UIImage imageNamed:@”Icon.png”];
UIImage *image2 = [UIImage imageNamed:@”Icon.jpg”];

送信データを作成してポストする

1行目:取り込んだクラスをインスタンス化します。 2行目:デリゲートでポスト結果やエラーを受け取るので処理先を指定します。 3行目:もし、ポスト時に文字列も渡すのなら「setPostString:withPostName:」を使ってデータをセットします。1つめの引数が渡すデータで2つめの引数がサーバー側で受け取る際に使用するポスト名。 4〜5行目:ポストする画像をセットします。文字列の場合と同様に1つめの引数が渡すデータで2つめの引数がサーバー側で受け取る際に使用するポスト名。 6行目:ここでポストするuriを指定してデータをポストします。

HTTPFileUpload *httpFileUpload = [[HTTPFileUpload alloc] init];
httpFileUpload.delegate = self;
[httpFileUpload setPostString:@”1234″ withPostName:@”password”];
[httpFileUpload setPostImage:image1 withPostName:@”data1″ fileName:@”Icon.png”];
[httpFileUpload setPostImage:image2 withPostName:@”data2″ fileName:@”Icon.jpeg”];
[httpFileUpload postWithUri:@”https://xxx.localhost/”];
[httpFileUpload release], httpFileUpload = nil;

ポスト結果またはエラーをデリゲートで受け取る

「httpFileUpload:didFailWithError:」でネットワークエラーの際などのエラー処理を行います。

「httpFileUploadDidFinishLoading:result:」でポスト後の処理を行います。もしポストした結果を受け取る場合には2つ目の引数の「result」にNSStringで返ってくるのでそれらを使用して処理を行います。

– (void)httpFileUpload:(NSURLConnection *)connection didFailWithError:(NSError *)error {
  NSLog(@”%@”, error);
}

– (void)httpFileUploadDidFinishLoading:(NSURLConnection *)connection result:(NSString *)result {
  NSLog(@”%@”, result);
}

あとは今後の課題や問題点など

  • HTTPFileUpLoadとは名ばかりの画像(jpg、png)しか対応していません。必要になったら他ファイルにも対応しようかと。
  • 自分が作ったプロジェクトでは正常に動いていますが。。。まだ使い込んでいないのでバグがあると思います。

そんな不安満載のクラスですが、少しでも参考なればということで公開しています。

もし、バグなどありましたら教えてください。

それにしてもHTTPの構造が少しだけ理解できてとっても勉強になりました。