Warum kann NSURLSession uploadTaskWithRequest: fromData: nicht auf den PHP-Server hochladen?

Der PHP-Code funktioniert gut. Ich habe Dateien von einem HTML-Formular auf demselben Server hochgeladen. Die Dateien, die hochgeladen wurden, reichten von 40 KB bis 2,0 MB, also nicht von der Größe. Das Hochladen von Dateien ist auf dem Server mit PHP 5.3 aktiviert

Ich habe viele Posts wie diesen gefunden (noch ohne Antwort):https://stackoverflow.com/questions/19710388/using-nsurlsession-to-upload-an-image.

Dieser verwendet uploadTaskWithRequest: fromFile: anstelle von fromData:NSURLSession stellen Sie sicher, dass der Upload funktioniert hat

Dies ist NSURLSessionDataTask anstelle von uploadTaskWithRequest:Kein Datenempfang mit NSURLSession

Und einige Posts, in denen uploadTaskWithRequest: fromData: steht, funktionieren einfach nicht:NSURLSession: Hochladen von Assets mit Hintergrundübertragung Der asynchrone Upload mit NSURLSession funktioniert nicht, die synchrone NSURLConnection jedoch undLaden Sie ein Bild von iOS nach PHP hoch

Ich habe die App so erstellt, dass sie den HTTP-Code zurückgibt und den Code 200 erhält. In der Server-Datei error_log ist nach dem Hochladen nichts enthalten. Alles scheint gut zu funktionieren, aber was auch immer passiert, die Datei wird nicht auf den Server geschrieben. Irgendwelche Ideen, was ich sonst noch versuchen kann, um herauszufinden, was falsch läuft?

Hier ist der PHP-Code:

<?php
$file='';
$uploaddir='';

////////////////
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
////////////////

if(isset($_FILES['userfile']['name'])){
      $uploaddir = './photos/'; //Uploading to same directory as PHP file
      $file = basename($_FILES['userfile']['name']);
      echo "file is set";
      $uploadFile = $file;
      $randomNumber = rand(0, 99999); 
      $newName = $uploaddir . $uploadFile;
        if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
            echo "Temp file uploaded. \r\n";
        } else {
            echo "Temp file not uploaded. \r\n";
        }
   if (move_uploaded_file($_FILES['userfile']['tmp_name'], $newName)) {
         $postsize = ini_get('post_max_size'); //Not necessary, I was using these
         $canupload = ini_get('file_uploads'); //server variables to see what was 
         $tempdir = ini_get('upload_tmp_dir'); //going wrong.
         $maxsize = ini_get('upload_max_filesize');
         echo "\r\n" .  $_FILES['userfile']['size'] . "\r\n" . $_FILES['userfile']['type'] ;
    }
}
?>

Und hier ist der iOS-Code:

- (void)uploadImage:(UIImage*)image {

    // 0 Define URL
    NSData *imageData = UIImageJPEGRepresentation(image, 0.6);
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.myserver.com/app/photos/uploadPhoto.php"]];
    NSString *boundary = @"0xKhTmLbOuNdArY";
    NSString *filename = [NSString stringWithFormat:@"someName.jpg"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

    // 4 Create object to put content into...
    NSMutableData *body = [NSMutableData data];
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\" filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]];
    //[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];


    //Not used with this:https://stackoverflow.com/questions/20893171/asynchronous-upload-with-nsurlsession-will-not-work-but-synchronous-nsurlconnect/20896632?noredirect=1#comment39074802_20896632
    //[request setHTTPBody:body];


    __block NSString *stringForText = @"Hola";
    ///////////////////////////////////////////////////
    // 3
    self.uploadTask = [upLoadSession uploadTaskWithRequest:request fromData:body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // ...
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) response;
        int errorCode = httpResponse.statusCode;
        NSString *errorStatus = [NSString stringWithFormat:@"%d",errorCode];

        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSString *totalResponse = [errorStatus stringByAppendingString:responseString];

        stringForText = totalResponse;
        [self updateView:stringForText];
        //UIAlertView *alertme = [[UIAlertView alloc] initWithTitle:@"error" message:totalResponse delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        //[alertme show];
        // 4
        self.uploadView.hidden = NO;
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    }];


    // 5
    [_uploadTask resume];
}

-(void)updateView:(NSString*)texto{
    dispatch_sync(dispatch_get_main_queue(), ^{
        self.myTextView.text = texto;
    });

}

Ich habe 777 Berechtigungen für diesen Ordner. Wie gesagt, ich konnte aus demselben PHP-Skript über ein HTML-Formular hochladen und damit in diesen Ordner schreiben.

Die totalResponse ist 200 für den http-Fehlercode und count = 0 sowie array (0) {} für den PHP-Dump.

Hier ist das Bild der Antwort vom Server direkt in der App:

Ich habe diese Zeilen nach dem Echo der hochgeladenen Temp-Datei hinzugefügt:

$body = $HTTP_RAW_POST_DATA;
echo "\n REQUEST" . $body;

Aber ich habe nur Folgendes verstanden:

file count=1 array(1) { ["user file"]=> array(5) { ["name"]=> string(12) "DrinkCO2.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(14) "/tmp/phpxg7oLZ" ["error"]=> int(0) ["size"]=> int(190550) } } file is setTemp file uploaded. REQUEST 190550 image/png

Antworten auf die Frage(2)

Ihre Antwort auf die Frage