2012-07-11 5 views
6

Sto sviluppando un'app di messaggistica e gli utenti possono anche inviare le immagini tra loro.
Quando un utente invia più di una foto li mando in parallelo (non mi aspettare il primo a finire il caricamento prima di inviare il secondo)Invio di più di un'immagine con AFNetworking

Prima di trasferirsi in AFNetworking sono riuscito a fare questo con ASIFormDataRequest e infatti, se ho inviato 2 immagini, entrambe sono state trasmesse in parallelo e consegnate con successo all'altro utente.

Quando provo a farlo con AFNetworking, ho un comportamento strano.
Cercherò di descrivere il caso sono state inviare user1 due immagini troppo user2:

  1. Utente1 inviare image1 -> tutto sembra ok, posso vedere l'avanzamento del caricamento.
  2. Utente1 quindi invia immagine2 -> sembra ancora ok, posso vedere lo stato di caricamento di entrambe le immagini
  3. image1 il caricamento è terminato -> utente2 ottiene un'immagine corrotta che sembra una combinazione di image1 e image2 insieme!
  4. caricati image2 è terminata -> user2 ottiene image2 successo

Questo è come mi inviare un'immagine

- (void)sendImageMsgWithPath:(NSString *)path 
         image:(UIImage *)image 
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure 
        progress:(void (^)(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress 
{ 
    NSData *imageData = UIImageJPEGRepresentation(image, 0.5); 

    // create the request 

    NSURLRequest *request = [[AppClient sharedClient] multipartFormRequestWithMethod:@"POST" path:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
          { 
           [formData appendPartWithFileData:imageData name:@"image_name" fileName:@"image_name.jpg" mimeType:@"image/jpeg"]; 
          }]; 


    // create the operation 

    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

    // set progress block 

    [operation setUploadProgressBlock:progress]; 

    //set completion blocks 

    [operation setCompletionBlockWithSuccess:success failure:failure]; 

    // set it to work in background 

    [operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:nil]; 

    // add it to the operations queue 

    [[AppClient sharedClient] enqueueHTTPRequestOperation:operation]; 
} 

*** il percorso per entrambi caricamento delle immagini è la stessa:

path = @ "FrontEnd? cmd = sendimage & fromuserid = 3 & touserid = 1 &"

verrà aggiunto alla baseURL per creare l'URL coplete:

@ "http://somename.myftp.org:8080/web_proj/FrontEnd?cmd=sendimage&fromuserid=3&touserid=1"

Questo sono le immagini che ho inviato:
image1
enter image description here

image2
enter image description here

immagine danneggiata
enter image description here

+0

assicurati di utilizzare buffer separati per ogni immagine che invii. Assicurati inoltre che il ricevitore utilizzi buffer separati per ciascuna immagine ricevuta. Sembra che vengano combinati da qualche parte. Infine, se si sta inviando/ricevendo su 3G/4G, è possibile che non si ottenga un notevole miglioramento del throughput inviando tutte le immagini in parallelo. Dovrai sperimentare per vedere quanti flussi sono ottimali. – nielsbot

+0

Riesco a farlo con la libreria ASIHTTPRequest, quindi probabilmente non è un problema del server. Riguardo i buffer nel lato client, beh, in realtà non lo gestisco, sto solo usando l'API di AFNetworking, non sono sicuro che la libreria lo gestisca o se ho bisogno di farlo ... – Eyal

+0

Come stai gestendo questo nel lato server? Forse stai scrivendo le immagini ricevute nello stesso file: il primo inizia a essere sovrascritto dal secondo, il secondo viene inviato ok, perché ha completamente sovrascritto il primo. – yonosoytu

risposta

1

Utilizzare un multipartFormRequest per tale uso qui di seguito il metodo:

- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method 
               path:(NSString *)path 
             parameters:(NSDictionary *)parameters 
          constructingBodyWithBlock:(void (^)(id <AFMultipartFormDataProxy>formData))block; 

Ad esempio come questo:

NSURLRequest* request = [[YourHTTPClient sharedHTTPClient] multipartFormRequestWithMethod:@"POST" 
        path:path 
        parameters:dict 
        constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
          [formData appendPartWithFileData:data1 
                 name:@"image1" 
                 fileName:@"image1.jpg" 
                 mimeType:@"image/jpeg"]; 
          [formData appendPartWithFileData:data2 
                 name:@"image2" 
                 fileName:@"image2.jpg" 
                 mimeType:@"image/jpeg"]; 
        } 
       }]; 
+0

Ma io uso multipartFormRequestWithMethod, non voglio inviare due immagini in una richiesta, le immagini sono inviate in due richieste separate ... – Eyal

1

Come stai creando gli oggetti UIImage che passare nel tuo sendImageMsgWithPath: metodo? Li stai creando usando imageWithData: (o simili)? Se è così, ho visto problemi come questo quando provo a riutilizzare NSMutableData. Sembra che anche dopo aver creato UIImage, il sottosistema abbia ancora bisogno di leggere quei dati in un secondo momento. E se da allora hai riutilizzato NSMutableData, l'immagine sarà danneggiata.

In tal caso, si consiglia di utilizzare un nuovo NSMutableData per creare ciascuna UIImage.

+0

No Ricevo l'immagine da UIImagePickerController ... – Eyal