Blog

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


iOSからファイル(主に画像)をアップロードする方法がわからずに調べていました。
サンプルはいくつか発見したのですが、複数の画像のポストが出来なかったりして悶々としていました。
「やるしかない!」っと言うことで、オレオレクラスを使って今後も使い回せるようにしてみました。
サンプルコードは以下から。よろしければどうぞ。

github – HTTPFileUploadSample

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

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

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

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

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

1
#import "HTTPFileUpload.h"

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

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

1
2
  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を指定してデータをポストします。

1
2
3
4
5
6
7
  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:@"http://xxx.localhost/"];
  [httpFileUpload release], httpFileUpload = nil;

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

「httpFileUpload:didFailWithError:」でネットワークエラーの際などのエラー処理を行います。
「httpFileUploadDidFinishLoading:result:」でポスト後の処理を行います。もしポストした結果を受け取る場合には2つ目の引数の「result」にNSStringで返ってくるのでそれらを使用して処理を行います。

1
2
3
4
5
6
7
8
9
- (void)httpFileUpload:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
  NSLog(@"%@", error);
}

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

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

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

そんな不安満載のクラスですが、少しでも参考なればということで公開しています。
もし、バグなどありましたら教えてください。

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



This Post Has 1 Comment

  1. akipon より:

    アップロードの進捗取れるようにしてみました。

    HTTPFileUpload.h
    -(void)rr:(int)totalBytesWritten totalBytesExpectedToWrite:(int)totalBytesExpectedToWrite;
    HTTPFileUpload.m
    – (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
    {
    if ([delegate_ respondsToSelector:@selector(rr:totalBytesExpectedToWrite:)]) {
    [delegate_ rr:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite];
    }
    }

Leave A Reply