kyuuuuuuuuuuriのブログ

うぇぶエンジニアになりたくてなりたくて震えるもろきゅうの日記です

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分でまわします。