iOSからHTTP経由でファイルをサーバーにアップロードする方法
iOSからファイル(主に画像)をアップロードする方法がわからずに調べていました。
サンプルはいくつか発見したのですが、複数の画像のポストが出来なかったりして悶々としていました。
「やるしかない!」っと言うことで、オレオレクラスを使って今後も使い回せるようにしてみました。
サンプルコードは以下から。よろしければどうぞ。
使い方はこんな感じです。
「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の構造が少しだけ理解できてとっても勉強になりました。