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:
- Utente1 inviare image1 -> tutto sembra ok, posso vedere l'avanzamento del caricamento.
- Utente1 quindi invia immagine2 -> sembra ancora ok, posso vedere lo stato di caricamento di entrambe le immagini
- image1 il caricamento è terminato -> utente2 ottiene un'immagine corrotta che sembra una combinazione di image1 e image2 insieme!
- 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
image2
immagine danneggiata
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
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
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