objective-c で imageをサーバにアップロードする
死にそうになりながらやってましたこれ。
まじこれ
通信が成功しても、何を書いているのかなにをしているのかいまいち把握してませ…
コードだけべた書き
NSImage* img = [[NSImage alloc]initWithContentsOfFile:@"画像ファイル"]; NSData* imgdata = [img TIFFRepresentation]; //ここからPOSTDATAの作成 NSString *urlString = @"post先のurl"; //←phpとかで NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; NSString *boundary = @"---------------------------168072824752491622650073"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name=\"upfile\"; filename=\"user.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imgdata]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString);
何をしているかわからないでしょ!!!!!!!
私はわからないです←
かろうじて、
POSTリクエストだなー
multipart/form-data で送ろうとしているなー
name=\"upfile\" でファイル名を指定しているなー
filename=\"user.png\ が画像ファイルの名前かなー
なんか全部UTF8にしているなー
がなんとなくわかるくらいですね。
boundaryという文字列があるけど、なんでしょうw
ここらへんを読めばわかりそうな気がするもしない
http://www.kanzaki.com/docs/html/htminfo32.html
ちなみにこれ、htmlで書くと3、4行で書けるらしいですw
ついでに、画像データを受け取る側のphpはこんな感じです
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?php if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) { if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "./" . $_FILES["upfile"]["name"])) { echo $_FILES["upfile"]["name"] . "をアップロードしました。"; } else { echo "ファイルをアップロードできません。"; } } else { echo "ファイルが選択されていません。"; } ?></p> </body> </html>
また、複数の画像をアップロードするときですが、
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name=\"upfile\"; filename=\"user.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imgdata]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
これを送りたい画像の分ループさせ
かつ、
name=\"upfile\" を name=\"upfile[]\"
に変更するだけです。
PHPの方では、
$_FILES["upfile"]["tmp_name"][i];
とかでfor分でまわします。