2015-06-30 8 views
7

Di seguito è snippet per il caricamento di un file immagine.Voglio utilizzare solo NSURLSessionUploadTask, perché fornisce la funzione di caricamento in background che voglio utilizzare nella mia app.NSURLSessionUploadTask non è riuscito a caricare il file

Inoltre, desidero impostare il parametro POST insieme al caricamento del file.

Anche io non sono buono nel codice lato server. Qualcuno può indicarmi cosa sto facendo di sbagliato.

Carica Codice

NSString* filePath = [[NSBundle mainBundle] 
         pathForResource:@"sample" ofType:@"jpg"]; 
uint64_t bytesTotalForThisFile = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileSize]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uploadPath]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:[NSString stringWithFormat:@"%llu", bytesTotalForThisFile] forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"]; 

[request setTimeoutInterval:30]; 

NSString* filePath = [[NSBundle mainBundle] 
         pathForResource:@"sample" ofType:@"jpg"]; 


NSURLSessionUploadTask *taskUpload= [self.uploadSession uploadTaskWithRequest:request fromFile:[[NSURL alloc] initFileURLWithPath:filePath]]; 

codice PHP

<?php 

$objFile = & $_FILES["file"]; 
$strPath = basename($objFile["name"]); 

if(move_uploaded_file($objFile["tmp_name"], $strPath)) { 
    print "The file " . $strPath . " has been uploaded."; 
} else { 
    print "There was an error uploading the file, please try again!"; 
} 

Dal lato server sto ottenendo array vuoto a $ _FILES

risposta

0

Io porrò un esempio di codice. Controlla se ricevi qualche errore sulla console.

// 1. config 
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 

// 2. if necessary set your Authorization HTTP (example api) 
// [config setHTTPAdditionalHeaders:@{@"<setYourKey>":<value>}]; 

// 3. Finally, you create the NSURLSession using the above configuration. 
NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; 

// 4. Set your Request URL 
NSURL *url = <yourURL>; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

// 5. Set your HTTPMethod POST or PUT 
[request setHTTPMethod:@"PUT"]; 

// 6. Encapsulate your file (supposse an image) 
UIImage *image = [UIImage imageNamed:@"imageName"]; 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

// 7. You could try use uploadTaskWithRequest fromData 
NSURLSessionUploadTask *taskUpload = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response; 
    if (!error && httpResp.statusCode == 200) { 

     // Uploaded 

    } else { 

     // alert for error saving/updating note 
     NSLog(@"ERROR: %@ AND HTTPREST ERROR : %ld", error, (long)httpResp.statusCode); 
     } 
}]; 
+0

Sto utilizzando la sessione in background non predefinita, Anche il gestore di completamento non è consentito nella sessione in background. Anche NSData come immagine non è consentito come immagine. – Mukesh

0

Se questo è il codice completo, quindi non sono in realtà partire il caricamento. NSURLSession le attività non vengono avviate automaticamente (a differenza di alcune chiamate NSURLConnection). Devi chiamare in modo esplicito il loro metodo di ripresa per avviare il caricamento, altrimenti le attività si limiteranno a rimanere lì e non faranno nulla.

In secondo luogo, si dovrebbe davvero utilizzare URLForResource anziché utilizzare un percorso e quindi convertirlo in un URL. Questo non dovrebbe infrangere il tuo codice, ma è molto più semplice usare solo gli URL per cominciare.

In terzo luogo, se è davvero necessario utilizzare un percorso, i metodi di convenienza (fileURLWithPath:) sono tuoi amici.

In quarto luogo, non è necessario impostare Content-Length, e IIRC, probabilmente non dovrebbe, perché non si sa quale sia la lunghezza dei contenuti sarà effettivamente se NSURLSession negozia qualsiasi tipo di codifica (ad esempio, comprimere i dati del file).

In quinto luogo, se il file è di grandi dimensioni, 30 secondi potrebbero non essere abbastanza lunghi.

In sesto luogo, se stai utilizzando versioni più recenti di iOS o OS X, assicurati di utilizzare un server HTTPS configurato correttamente o di aver aggiunto un'eccezione di sicurezza del trasporto di app appropriata.

Infine, se si desidera includere altri parametri POST anziché fornire semplicemente il blob dei dati come corpo della richiesta, sarà necessario utilizzare una richiesta di streaming. Puoi, ovviamente, usare banalmente i parametri GET, ed è quello che consiglierei di fare, perché è un modo molto più semplice di fare le cose. :-)