¿Por qué NSURLSession uploadTaskWithRequest: fromData: falla al cargar al servidor php?

El código php funciona bien. He subido archivos de un formulario html en el mismo servidor. Los archivos cargados oscilaron entre 40K y 2.0M, por lo que no es de tamaño. La carga de archivos se activa en el servidor que ejecuta PHP 5.3

Encontré muchas publicaciones como esta (sin una respuesta aún):https://stackoverflow.com/questions/19710388/using-nsurlsession-to-upload-an-image.

Este usa uploadTaskWithRequest: fromFile: en lugar de fromData:NSURLSession asegúrese de que la carga funcionó

Esto es NSURLSessionDataTask en lugar de uploadTaskWithRequest:No se reciben datos con NSURLSession

Y algunas publicaciones que parecen decir uploadTaskWithRequest: fromData: simplemente no funciona:NSURLSession: carga de activos con transferencia de fondo la carga asíncrona con NSURLSession no funcionará, pero NSURLConnection sí funciona ySubir imagen de iOS a PHP

He creado la aplicación de modo que devuelva el código HTTP y obtengo el código 200. El archivo error_log del servidor no contiene nada después de cargarlo. Todo parece funcionar bien, pero pase lo que pase, el archivo no se escribe en el servidor. ¿Alguna idea de qué más puedo tratar de averiguar qué va mal?

Aquí está el código php:

<?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'] ;
    }
}
?>

y aquí está el código de iOS:

- (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;
    });

}

Tengo 777 permisos en esa carpeta. Como dije, he podido cargar y escribir en esa carpeta desde el mismo script php a través de un formulario html.

TotalResponse es 200 para el código de error http y count = 0, así como array (0) {} para el volcado de php.

Aquí está la imagen de la respuesta del servidor directamente en la aplicación:

Agregué estas líneas después de hacer eco del archivo temporal cargado:

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

Pero solo tengo esto:

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta