ios Caricare l’Immagine e Testo tramite HTTP POST

Grazie per la lettura.

Sono nuovo di iOS e sto cercando di caricare un’Immagine e un testo utilizzando multi-part form encoding in iOS.

Il curl equivalente è qualcosa di simile a questo: curl -F "param1=value1" -F "[email protected]" "http://some.ip.address:5000/upload"

Il curl comando restituisce la risposta corretta previsto in JSON.

Problema:
Continuo a ricevere un HTTP 400 richiesta, il che significa che sto facendo qualcosa di sbagliato durante la scrittura di POST HTTP, Corpo.

Quello Che Ho Fatto:
Per alcuni riferimenti, ho provato Flickr API di iOS app “POST di dimensioni troppo grandi!” e Obiettivo C: Come caricare le immagini e il testo tramite HTTP POST?. Ma, continuo a ricevere un HTTP 400.

Ho provato il ASIHttpRequest ma aveva un problema diverso (la richiamata mai stato chiamato). Ma, io non indagare ulteriormente che da quando ho sentito lo sviluppatore ha smesso di sostenere la biblioteca: http://allseeing-i.com/[request_release];

Qualcuno potrebbe per favore aiutarmi?

  • Ho usato NSURLConnection. stackoverflow.com/questions/8042360/…
  • Grazie per il link. In realtà, che ancora mi dà un errore 400. Ho stampato il post http corpo – e invece dell’immagine io vedo solo due caratteri indesiderati. Così, quando si aggiunge il imageData, è di tipo NSData – dovrebbe essere una stringa codificata in base64, invece? BTW, il mio imageToPost è di tipo UIImage.
  • Che il codice come scritto funziona nel mio app per postare le immagini al nostro web server (Linux/PHP). L’immagine è un UIImage.
  • Molte Grazie! 🙂
  • possibile duplicato di Obiettivo C: Come caricare le immagini e il testo tramite HTTP POST?
InformationsquelleAutor Sagar Hatekar | 2011-12-19



10 Replies
  1. 223

    Ecco il codice dalla mia app per postare un’immagine per il nostro web server:

    //Dictionary that holds post parameters. You can set your post parameters that your server accepts or programmed to accept.
    NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];
    [_params setObject:[NSString stringWithString:@"1.0"] forKey:[NSString stringWithString:@"ver"]];
    [_params setObject:[NSString stringWithString:@"en"] forKey:[NSString stringWithString:@"lan"]];
    [_params setObject:[NSString stringWithFormat:@"%d", userId] forKey:[NSString stringWithString:@"userId"]];
    [_params setObject:[NSString stringWithFormat:@"%@",title] forKey:[NSString stringWithString:@"title"]];
    
    //the boundary string : a random string, that will not repeat in post data, to separate post data fields.
    NSString *BoundaryConstant = [NSString stringWithString:@"----------V2ymHFg03ehbqgZCaKO6jy"];
    
    //string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ 
    NSString* FileParamConstant = [NSString stringWithString:@"file"];
    
    //the server url to which the image (or the media) is uploaded. Use your server url here
    NSURL* requestURL = [NSURL URLWithString:@""]; 
    
    //create request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];                                    
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setHTTPShouldHandleCookies:NO];
    [request setTimeoutInterval:30];
    [request setHTTPMethod:@"POST"];
    
    //set Content-Type in HTTP header
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"];
    
    //post body
    NSMutableData *body = [NSMutableData data];
    
    //add params (all params are strings)
    for (NSString *param in _params) {
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
    }
    
    //add image data
    NSData *imageData = UIImageJPEGRepresentation(imageToPost, 1.0);
    if (imageData) {
        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:imageData];
        [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    }
    
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    
    //setting the body of the post to the reqeust
    [request setHTTPBody:body];
    
    //set the content-length
    NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long) [body length]];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    
    //set URL
    [request setURL:requestURL];
    • Per la gente di riferimento questo codice: “BoundaryConstant” è fondamentalmente la variabile “di confine”, che è essenzialmente casuale (NSString *), “FileParamConstant” è fondamentalmente il tuo “filename.jpg”.
    • Questo ha funzionato incredibilmente. Grazie mille per la pubblicazione!
    • Grazie per la pubblicazione – questo è super utile. Maggio è un giorno di trovare una miniera di platino come una ricompensa per il vostro suggestione.
    • +1 per estremamente utile post. Ha lavorato come un fascino.
    • Tra l’enorme quantità di post sull’argomento, questo è stato il migliore. Grazie uomo.
    • questo non consente di duplicati di chiavi, e anche le mie foto non vengono inviati al mio webservice anche se sono trasferito (ci vogliono 15 sec non finire a causa della foto) ma il mio webservice non li riconosce
    • C’è una differenza tra il boundary e BoundaryConstant variabili? Io presumo che siano la stessa cosa.
    • sono la stessa cosa, ho risolto il codice di esempio.
    • Ho provato questo codice ma penso che manca l’istruzione in realtà a lanciare la richiesta. Qualcuno può dirmi di cosa si tratta in questo caso?
    • Ci sono molti modi per inviare la richiesta. Guarda la documentazione per NSURLConnection.
    • non trascinare troppo, sarà qualcosa del tipo: [NSURLConnection sendAsynchronousRequest:coda di richieste:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *risposta, NSData *dati NSError *connectionError) {}];
    • TI AMO!!! Ho trascorso l’intera giornata a sbattere la testa contro il muro!
    • Ho usato la tua raccomandazione per l’attuazione del codice, e ha funzionato come un fascino! Grazie a voi!
    • Cosa succede se voglio inviare l’immagine, contro circa il valore della chiave .. ad esempio : – inviare l’immagine in chiave “immagine” ?
    • Ha funzionato per me grazie
    • qualcuno può spiegarmi o darmi un riferimento di come le cose stanno accadendo sotto il cofano, perché per un principiante è molto difficile capire cosa sta succedendo qualcuno che può spiegare come l’intero processo si svolge dall’inizio e la procedura in dettaglio. Qualsiasi aiuto sarebbe apprezzato.
    • Posso aggiungere tutto il corpo di un altro valore di chiave, che è in un altro dizionario. Perché il mio server accetta questo formato, altrimenti è dare cattivo richiesta di risposta?

  2. 68

    XJones‘ la risposta e ha lavorato come un fascino.

    Ma non ha menzionato/variabili dichiarate _params, BoundaryConstant e requestURL. Così, ho pensato di distacco, che parte come un add-on per il suo post, in modo che si può aiutare gli altri in futuro.

    //Dictionary that holds post parameters. You can set your post parameters that your server accepts or programmed to accept.
    NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];
    [_params setObject:[NSString stringWithString:@"1.0"] forKey:[NSString stringWithString:@"ver"]];
    [_params setObject:[NSString stringWithString:@"en"] forKey:[NSString stringWithString:@"lan"]];
    [_params setObject:[NSString stringWithFormat:@"%d", userId] forKey:[NSString stringWithString:@"userId"]];
    [_params setObject:[NSString stringWithFormat:@"%@",title] forKey:[NSString stringWithString:@"title"]];
    
    //the boundary string : a random string, that will not repeat in post data, to separate post data fields.
    NSString *BoundaryConstant = [NSString stringWithString:@"----------V2ymHFg03ehbqgZCaKO6jy"];
    
    //string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ 
    NSString* FileParamConstant = [NSString stringWithString:@"file"];
    
    //the server url to which the image (or the media) is uploaded. Use your server url here
    NSURL* requestURL = [NSURL URLWithString:@""]; 

    Come ho detto earler, questa non è una risposta da solo, basta un addon per XJones’ post.

    • Penso che si dovrebbe quindi modificare il suo post.
    • voglio inviare 2 file audio con l’immagine e alcune stringhe per il server. Plz mi suggerisce come fare.
  3. 9

    Per http post immagine e il nome utente e la password di invio tramite post
    metodo

     NSString *str=[NSString stringWithFormat:@"%@registration.php",appdel.baseUrl];
     NSString *urlString = [NSString stringWithFormat:@"%@",str];
    
     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
     [request setURL:[NSURL URLWithString:urlString]];
     [request setHTTPMethod:@"POST"];
     NSMutableData *body = [NSMutableData data];
     NSString *boundary = @"---------------------------14737809831466499882746641449";
     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=\"file\"; filename=\"a.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[NSData dataWithData:imgData]];
     [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
     // parameter username
    
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
     [body appendData:[userName.text dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
    
     // parameter token
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"email\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
     [body appendData:[eMail.text dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
    
     //parameter method
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"pass\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
     [body appendData:[passWord.text dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
    
     //parameter method
     NSLog(@"%@",countryCode);
     [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"country\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    
     [body appendData:[countryCode dataUsingEncoding:NSUTF8StringEncoding]];
     [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
     //close form
     [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    
     //setting the body of the post to the reqeust
     [request setHTTPBody:body];
    
    
     NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
     //NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
     NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableLeaves error:nil];
     Nslog(@"%@",dict);
     //
    • ho provato in questo modo ma il mio (nsmutabledata) è in fase di null alla fine di setHTTPBody tempo. ho dimenticato qualcosa?
    • per me il suo lavoro. può essere il tuo webservice problema perché u r dando giù voto dare a me dare un voto positivo?
  4. 6

    Utilizzare AFNetworking; Mettere altri parametri il parametro dizionario e aggiungere i dati dell’immagine in forma di dati.

    //Upload Image Using AFNetworking
    
    -(BOOL)uploadImageAFNetworkingWithURL:(NSString *)path andImage:(UIImage *)image andImageNameWithExtension:(NSString *)strImageName andParamDict:(NSDictionary *)dictParam andKeyForUploadingImage:(NSString *)keyUplaodImg{
    
        NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
        NSString *strError = EMPTY_STRING;
    
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
         manager.requestSerializer = [AFJSONRequestSerializer serializer];
        [manager POST:path parameters:dictParam constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    
            [formData appendPartWithFileData:imageData name:keyUplaodImg fileName:strImageName mimeType:@"image/jpeg"];
    
        } success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"success = %@", responseObject);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"error = %@", error);
            NSLog(@"Response = %@", operation);
            [strError stringByAppendingString:STR_ERR_MESSAGE];
        }];
        if(strError.length>0){
            return NO;
        }else{
            return YES;
        }
    }
    • sempre problema per nidificata dizionario parametro, formato json non riceve in destra formiato alla fine del server. Qualsiasi aiuto??
  5. 3

    Qui è il mio simile kit di rete libreria per il caricamento di file come form multipart:

    WebRequest *request = [[WebRequest alloc] initWithPath:@"...documents/create.json"];
    
    //optional attributes
    request.delegate = delegate;
    request.notificationName = @"NotificationDocumentUploaded";
    request.queue = myQueue;
    
    NSMutableData *body = [NSMutableData data];
    NSString *boundary = @"TeslaSchoolProjectFormBoundary";
    
    [body appendPartName:@"document[name]" value:@"Test" boundary:boundary];
    [body appendPartName:@"document[description]" value:@"This is a description" boundary:boundary];
    [body appendPartName:@"document[category]" value:@"Drama" boundary:boundary];
    ...
    [body appendPartName:@"commit" value:@"Save" boundary:boundary];
    NSData *fileData = [[NSData alloc] initWithContentsOfURL:someFileURL];
    [body appendPartFile:fileName name:@"document[file]" data:fileData mimeType:mimeType boundary:boundary];
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [request setHTTPBody:body];
    
    NSString *bodyLength = [NSString stringWithFormat:@"%lu",(unsigned long)[body length]];
    [request addValue:bodyLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];
    
    
    //optional values
    [request addValue:@"gzip,deflate,sdch" forHTTPHeaderField:@"Accept-Encoding"];
    [request addValue:@"max-age=0" forHTTPHeaderField:@"Cache-Control"];
    [request addValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" forHTTPHeaderField:@"Accept"];
    [request addValue:@"en-US,en;q=0.8,hr;q=0.6,it;q=0.4,sk;q=0.2,sl;q=0.2,sr;q=0.2" forHTTPHeaderField:@"Accept-Language"];
    
    
    [request setHTTPMethod:@"POST"];
    [WebRequestProcessor process:request];

    Utilizzare il delegato per la notifica di caricamento di progresso.

    Utilizzare il notificationName per notificare quando la richiesta è finito.

    Utilizzare il coda per l’aggiunta di questa richiesta nella vostra operazione di coda, in modo che saranno trattati nel momento giusto.

    • Una biblioteca senza prefisso — di sicuro non è nei miei progetti.
  6. 1

    ecco il lavoro swift code tradotto da il codice fornito da @xjones.
    Grazie mille per il vostro aiuto mate. Il tuo era l’unico modo che ha funzionato per me.
    Ho usato questo metodo per inviare 1 immagine e un altro parametro per un webservice made in asp.net


                        let params = NSMutableDictionary()
    
                        let boundaryConstant  = "----------V2y2HFg03eptjbaKO0j1"
    
                        let file1ParamConstant = "file1"
                        params.setObject(device_id!, forKey: "deviceID")
    
                        let requestUrl = NSURL(string: "\(siteurl):\(port)/FileUpload/Upload")
    
                        let request = NSMutableURLRequest()
    
                        request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
                        request.HTTPShouldHandleCookies=false
                        request.timeoutInterval = 30
                        request.HTTPMethod = "POST"
    
                        let contentType = "multipart/form-data; boundary=\(boundaryConstant)"
    
                        request.setValue(contentType, forHTTPHeaderField: "Content-Type")
    
                        let body = NSMutableData()
    
                        //parameters
    
                        for param in params {
    
                        body.appendData("--\(boundaryConstant)\r\n" .dataUsingEncoding(NSUTF8StringEncoding)! )
                        body.appendData("Content-Disposition: form-data; name=\"\(param)\"\r\n\r\n" .dataUsingEncoding(NSUTF8StringEncoding)!)
                        body.appendData("\(param.value)\r\n" .dataUsingEncoding(NSUTF8StringEncoding)!)
    
                        }
                        //images
    
                        //image begin
                        body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
                        body.appendData("Content-Disposition: form-data; name=\"\(file1ParamConstant)\"; filename=\"image.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
                        body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
                        body.appendData(passportImageData)
                        body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
                        //image end
    
    
    
                        body.appendData("--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
                        request.HTTPBody  = body
                        let postLength = "\(body.length)"
                        request.setValue(postLength, forHTTPHeaderField: "Content-Length")
                        request.URL = requestUrl
    
                        var serverResponse = NSString()
    
                        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
                            data, response, error in
    
                            if error != nil
                            {
                                print("error=\(error)")
                                return
                            }
    
    
                            print("response = \(response)")
    
    
                            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
                            print("responseString = \(responseString!)")
                            serverResponse = responseString!
    
    
                            }
    
                                task.resume()
  7. 1

    Qui è una Swift versione. Si noti che se non si desidera inviare i dati del modulo è necessario inviare il modulo vuoto di confine. Pallone, in particolare, prevede che i dati del modulo seguita da file di dati e non popolare request.files senza il primo confine.

      let composedData = NSMutableData()
    
      //Set content type header
      let BoundaryConstant = "--------------------------3d74a90a3bfb8696"
      let contentType = "multipart/form-data; boundary=\(BoundaryConstant)"
      request.setValue(contentType, forHTTPHeaderField: "Content-Type")
    
      //Empty form boundary
      composedData.appendData("--\(BoundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
      //Build multipart form to send image
      composedData.appendData("--\(BoundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      composedData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"image.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      composedData.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      composedData.appendData(rawData!)
      composedData.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
      composedData.appendData("--\(BoundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    
      request.HTTPBody = composedData
    
      //Get content length
      let length = "\(composedData.length)"
      request.setValue(length, forHTTPHeaderField: "Content-Length")
  8. 1

    Caricare l’immagine con i dati di un modulo utilizzando NSURLConnection classe in Swift 2.2:

        func uploadImage(){
            let imageData = UIImagePNGRepresentation(UIImage(named: "dexter.jpg")!)
    
            if imageData != nil{
                let str = "https://staging.mywebsite.com/V2.9/uploadfile"
                let request = NSMutableURLRequest(URL: NSURL(string:str)!)
                request.HTTPMethod = "POST"
    
                let boundary = NSString(format: "---------------------------14737809831466499882746641449")
    
                let contentType = NSString(format: "multipart/form-data; boundary=%@",boundary)
                request.addValue(contentType as String, forHTTPHeaderField: "Content-Type")
    
                let body = NSMutableData()
    
                //append image data to body
                body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
                body.appendData(NSString(format:"Content-Disposition: form-data; name=\"file\"; filename=\"img.jpg\"\\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
                body.appendData(NSString(format: "Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
                body.appendData(imageData!)
                body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
    
                request.HTTPBody = body
    
                do {
                    let returnData = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
                    let returnString = NSString(data: returnData, encoding: NSUTF8StringEncoding)
                    print("returnString = \(returnString!)")
                }
                catch let  error as NSError {
                    print(error.description)
                }
            }
        }

    Nota: utilizzare Sempre sendAsynchronousRequest metodo invece di sendSynchronousRequest per l’upload/download dei dati per evitare il blocco del thread principale. Qui ho usato sendSynchronousRequest solo a scopo di test.

  9. 0

    Posso mostrarvi un esempio di caricamento di un .txt file su un server con NSMutableURLRequest e NSURLSessionUploadTask con l’aiuto di un php script.

    -(void)uploadFileToServer : (NSString *) filePath
    {
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://YourURL.com/YourphpScript.php"]];
    [request setHTTPMethod:@"POST"]; 
    [request addValue:@"File Name" forHTTPHeaderField:@"FileName"];
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject];
    
    NSURLSessionUploadTask* uploadTask = [defaultSession uploadTaskWithRequest:request fromFile:[NSURL URLWithString:filePath] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                              if (error || [httpResponse statusCode]!=202)
                                              {
    
                                                  //Error
                                              }
                                              else
                                              {
                                                 //Success
                                              }
                                              [defaultSession invalidateAndCancel];
                                          }];
    [uploadTask resume];
    }

    Script php

    <?php 
    $request_body = @file_get_contents('php://input');
    foreach (getallheaders() as $name => $value) 
    {
        if ($FileName=="FileName") 
        {
            $header=$value;
            break;
        }
    }   
    $uploadedDir = "directory/";
    @mkdir($uploadedDir);
    file_put_contents($uploadedDir."/".$FileName.".txt",
    $request_body.PHP_EOL, FILE_APPEND);
    header('X-PHP-Response-Code: 202', true, 202);  
    ?>       
  10. 0
    use below code. it will work fine for me.
    
    +(void) sendHttpRequestWithArrayContent:(NSMutableArray *) array 
    ToUrl:(NSString *) strUrl withHttpMethod:(NSString *) strMethod 
    withBlock:(dictionary)block
    {
    if (![Utility isConnectionAvailableWithAlert:TRUE])
    {
        [Utility showAlertWithTitle:@"" andMessage:@"No internet connection available"];
    }
    
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ;
    
    [request setURL:[NSURL URLWithString:strUrl]];
    [request setTimeoutInterval:120.0];
    [request setHTTPMethod:strMethod];
    
    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    
    NSMutableData *body=[[NSMutableData alloc]init];
    
    for (NSMutableDictionary *dict in array)
    {
        if ([[dict valueForKey:[[dict allKeys]objectAtIndex:0]] isKindOfClass:[NSString class]])
        {
            [body appendData:[self contentDataFormStringWithValue:[dict valueForKey:[[dict allKeys]objectAtIndex:0]] withKey:[[dict allKeys]objectAtIndex:0]]];
        }
        else if ([[dict valueForKey:[[dict allKeys]objectAtIndex:0]] isKindOfClass:[UIImage class]])
        {
            [body appendData:[self contentDataFormImage:[dict valueForKey:[[dict allKeys]objectAtIndex:0]] withKey:[[dict allKeys]objectAtIndex:0]]];
        }
        else if ([[dict valueForKey:[[dict allKeys]objectAtIndex:0]] isKindOfClass:[NSMutableDictionary class]])
        {
            [body appendData:[self contentDataFormStringWithValue:[dict valueForKey:[[dict allKeys]objectAtIndex:0]] withKey:[[dict allKeys]objectAtIndex:0]]];
        }
        else
        {
            NSMutableData *dataBody = [NSMutableData data];
            [dataBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            [dataBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"ipodfile.jpg\"\r\n",@"image"] dataUsingEncoding:NSUTF8StringEncoding]];
            [dataBody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    
            [dataBody appendData:[dict valueForKey:[[dict allKeys]objectAtIndex:0]]];
    
            [body appendData:dataBody];
        }
    }
    
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    [request setHTTPBody:body];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
     {
         if (!data) {
             NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
              [dict setObject:[NSString stringWithFormat:@"%@",SomethingWentWrong] forKey:@"error"];
             block(dict);
             return ;
         }
         NSError *error = nil;
        //NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
         NSLog(@"%@",dict);
         if (!dict) {
             NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
             [dict setObject:ServerResponceError forKey:@"error"];
             block(dict);
             return ;
         }
         block(dict);
    
     }];
    
    }
    +(NSMutableData*) contentDataFormStringWithValue:(NSString*)strValue 
    withKey:(NSString *) key
    {
    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSMutableData *data=[[NSMutableData alloc]init];
    [data appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:[[NSString stringWithFormat:@"%@",strValue] dataUsingEncoding:NSUTF8StringEncoding]];  //title
    return data;
    }
    
    +(NSMutableData*) contentDataFormImage:(UIImage*)image withKey:
    (NSString *) key
    {
    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"ipodfile.jpg\"\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    NSData *imageData=UIImageJPEGRepresentation(image, 0.40);
    [body appendData:imageData];
    
    return body;
    }

Lascia un commento