iOSファイルのアップロード
iOSで, ファイルをサーバーに送信する方法です。
NSMutableURLRequest を使って, postします。 multipart属性を使って, postするデータに NSDataを含めれば, ファイルをNSDataにすればファイルの内容を送信できます。
サーバー側で受ける方法ですが,いろいろあると思います。筆者は, Java な人間なので, Servlet + commons fileUpload で受けています。
サンプル
-(void)post:(NSURL *)url file:(NSString *)file { NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:url]; [urlRequest setHTTPMethod:@"POST"]; // Method type [urlRequest setTimeoutInterval:120]; // Timeout [urlRequest setValue:"header" forHTTPHeaderField:"x-head"]; // This is header [urlRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"]; NSMutableData *postData = [[NSMutableData alloc] init]; [postData appendData:[[NSString stringWithFormat:@"--%@\r\n", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\";filename=\"%@\" \r\n\r\n", @"test"] dataUsingEncoding:NSUTF8StringEncoding]]; NSData *fileData = [[NSData alloc] initWithContentsOfFile:file]; [postData appendData:fileData]; [postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [urlRequest setHTTPBody:postData]; NSURLResponse *responce; NSError *error = nil; NSData *result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&responce error:&error]; }
bounddary の文字列 kBoundaryですが, なんでもよかった気がします。
#define kBoundary @"project_boundary"
こんな感じで, プロジェクト名かなんかをいれておけばよいですよ。
解説
通常のリクエストと同じように, NSMutableURLRequestとNSURLConnectionを使っています。この例では, syncですが, asyncでも問題ありません。
リクエストに, multipartに関わる記述を入れてその間に, NSMutableDataをbodyとして入れています。
boundaryの部分を追加していけば, 複数でも, さらに別のデータ(文字列)なども送ることができます。
ん〜, 受ける側も書いておいた方がいいかな。