3

これが私のスリムなフレームワークのphpコードです

    $app->post('/uploadPicture', function () {

    if (!empty($_FILES)) {

        global $config;
        $picturePath = $config->get('db', 'picture');

        $allowedExts = array("jpg", "jpeg", "png");
        $extension = end(explode(".", $_FILES["file"]["name"]));

        if ($_FILES["file"]["type"] == "image/jpg" || $_FILES["file"]["type"] == "image/jpeg" || $_FILES["file"]["type"] == "image/png" && $_FILES["file"]["size"] < 2500000 && in_array($extension, $allowedExts)) {

            if ($_FILES["file"]["error"] > 0) {

                echo "Error: " . $_FILES["file"]["error"] . "<br />";
            } else {

                if (move_uploaded_file($_FILES['file']['tmp_name'], $picturePath . $_FILES["file"]["name"])) {
                    echo "success";
                }

            }
        } else {

            echo "Invalid file type";
        }
    } else {

        echo "no file to upload";
    }

});

これは私がiPhone側で使っているものです。

    -(void)uploadImage:(UIImage *)image withPersistentID:(NSString *)persistentID {

    [[MSMAMobileAPIClient sharedClient] POST:@"uploadPicture" parameters:nil constructingBodyWithBlock:^(id <AFMultipartFormData>formData) {

        NSData *imageData = UIImageJPEGRepresentation(image, 90);

        NSString *fileName = [NSString stringWithFormat:@"%@.jpg", persistentID];

        [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpg"];

    } success:^(NSURLSessionDataTask * task, id responderData) {

        self.itemImageBlock(YES);

    } failure:^(NSURLSessionDataTask * task, NSError * error) {

        NSLog(@"%@",[error.userInfo objectForKey:@"JSONResponseSerializerWithDataKey"]);
        self.itemImageBlock(NO);

    }];

}

iPhone側では、サーバーがビジーであるようにハングしているように見え、最終的にタイムアウトで失敗します。

CocoaRestClient を使用しており、画像をアップロードできます。

また、iPhone からアップロードしようとすると、ファイルが php の一時ディレクトリに追加されます。

私は何か間違ったことをしていますか?

編集: エラー ログ行を uploadPicture 関数に追加したところ、そもそも iPhone によって呼び出されているようには見えません! :(

EDIT2: エラー メッセージが返された NSLog を次に示します。

Error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x17d6e1c0 {NSErrorFailingURLStringKey=https://192.168.1.15/mamobile/index.php/uploadPicture, NSErrorFailingURLKey=https://192.168.1.15/mamobile/index.php/uploadPicture, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x17db1460 "The request timed out."}

編集 3: スリムな php フレームワークを削除し、画像のみをアップロードする単純な php スクリプトを作成しました。

<?php 


if (!empty($_FILES)) {

    //load configuration file
    require_once 'Lite/Lite.php';
    $config = new Config_Lite('config.ini');
    $picturePath = $config->get('db', 'picture');

        $allowedExts = array("jpg", "jpeg", "png");
        $extension = end(explode(".", $_FILES["file"]["name"]));

        if ($_FILES["file"]["type"] == "image/jpg" || $_FILES["file"]["type"] == "image/jpeg" || $_FILES["file"]["type"] == "image/png" && $_FILES["file"]["size"] < 2500000 && in_array($extension, $allowedExts)) {

            if ($_FILES["file"]["error"] > 0) {

                echo "Error: " . $_FILES["file"]["error"] . "<br />";
            } else {

                if (move_uploaded_file($_FILES['file']['tmp_name'], $picturePath . $_FILES["file"]["name"])) {
                    echo "success";
                }

            }
        } else {

            echo "Invalid file type";
        }
    } else {

        echo "no file to upload";
    }

?>

次に、このように動作するようにコードを変更しました。

NSString *urlString = [NSString stringWithFormat:@"https://%@/mamobile/uploadPicture.php", [[NSUserDefaults standardUserDefaults] stringForKey:@"serviceIPAddress"]];
    AFHTTPSessionManager *imageSession = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:urlString]];
    imageSession.responseSerializer = [MSJSONResponseSerializerWithData serializer];
    [imageSession.requestSerializer setAuthorizationHeaderFieldWithUsername:@"fake username" password:@"fake password"];
    [imageSession.securityPolicy setAllowInvalidCertificates:YES];

    [imageSession POST:@"" parameters:nil constructingBodyWithBlock:^(id <AFMultipartFormData>formData) {

        NSData *imageData = UIImageJPEGRepresentation(image, 90);

        NSString *fileName = [NSString stringWithFormat:@"%@.jpg", persistentID];

        NSLog(@"uploading image '%@' with size = %@",fileName,[NSByteCountFormatter stringFromByteCount:imageData.length countStyle:NSByteCountFormatterCountStyleFile]);

        [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpg"];

    } success:^(NSURLSessionDataTask * task, id responderData) {
        NSLog(@"Success: %@", responderData);
        self.itemImageBlock(YES);

    } failure:^(NSURLSessionDataTask * task, NSError * error) {
        NSLog(@"Error: %@",error);
        self.itemImageBlock(NO);

    }];

しかし、それでも同じタイムアウト メッセージが表示されます。したがって、スリムな php フレームワークとは何の関係もありません。

4

2 に答える 2