2013-03-20 16 views
9

Sto tentando di inviare un'immagine che l'utente accede al server. Ricevo la rappresentazione JPEG, la aggiungo alla stringa necessaria per caricare la foto, quindi invio i dati tramite NSOutputStream. Tuttavia, quando provo a riavere la foto dal server, ne vedo solo il 10% dall'alto. Qualsiasi aiuto sarebbe apprezzato.Invio di UIImage su NSOutputStream

btw. la presa è aperta e connessa.

Ecco il mio codice:

NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID]; 
NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding]; 

NSData *imgData = UIImageJPEGRepresentation(image, 1.0); 

NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]]; 
[completeData appendData:imgData]; 

//sending NSData over to server 
[self.outputStream write:[completeData bytes] maxLength:[completeData length]]; 
+0

hai provato diversa compressione JPEG? Mi piace (immagine, 0.4f) – ApolloSoftware

+0

Mi chiedo se è superata la soglia limite di dimensioni – ApolloSoftware

+0

Puoi provare a scrivere l'immagine in memoria (buffer) e provare a rendere l'immagine recuperata? Ho provato a farlo in memoria e ha funzionato bene per una foto 1024 x 683. Ecco alcuni esempi di codice: https://gist.github.com/abellina/5205633. – abellina

risposta

3

direi si sta solo cercando di scrivere troppi dati alla volta per il buffer. Fare qualcosa di simile a un ciclo sui dati e inviarlo a pezzi, invece:

NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID]; 
    NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding]; 

    NSData *imgData = UIImageJPEGRepresentation(image, 1.0); 

    NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]]; 
    [completeData appendData:imgData]; 

    NSInteger bytesWritten = 0; 
    while (completeData.length > bytesWritten) 
    { 
     while (! self.outputStream.hasSpaceAvailable) 
      [NSThread sleepForTimeInterval:0.05]; 

     //sending NSData over to server 
     NSInteger writeResult = [self.outputStream write:[completeData bytes]+bytesWritten maxLength:[completeData length]-bytesWritten]; 
     if (writeResult == -1) { 
      NSLog(@"error code here"); 
     } 
     else { 
      bytesWritten += writeResult; 
     } 
    } 
} 
// Both input and output should be closed to make the code work in swift 
+0

Meraviglioso. Lo userò ora! –

5

E 'a causa della vostra dimensioni dell'immagine limite venga superato.

Il modo migliore per gestire questo è implementare la seguente logica.

(è consigliato 1024 per pezzo) Sender

  1. Convert UIimage a NSData

  2. contempla la NSData a diversi pezzi

  3. Invia & pista ogni pezzo di NSData

ricevitore

  1. Dichiarare NSData e Conservare la prima parte del NSData pezzo (1024) in esso, che è ricevuto.

  2. Ricevi i prossimi pezzi di NSData e fare uso appendData: metodo per aggiungerlo

  3. Una volta che tutti i pezzi sono stati ricevuti, convertire la ricevuta NSData come UIImage

Assicurarsi di progettare diversi strutture per il trasferimento dei dati come blocchi come la struttura per rappresentare i dettagli (chunk totale, dimensione totale, dimensione chunk ecc.), struttura per rappresentare i dati (dimensione corrente del chunk, numero corrente chunk ecc.), struttura per rappresentare il r espande i dati (stato di consegna, numero di blocco consegnato ecc.).