2013-03-20 42 views
9

我試圖發送一個用戶帶到服務器的圖像。我得到JPEG表示,將其附加到上傳照片所需的字符串,然後通過NSOutputStream發送數據。但是,當我試圖從服務器上取回照片時,我只能看到它從頂端的10%。任何幫助,將不勝感激。通過NSOutputStream發送UIImage

btw。插座打開並連接。

這裏是我的代碼:

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

你有沒有嘗試過不同的JPEG壓縮?像(image,0.4f) – ApolloSoftware 2013-03-20 15:02:07

+0

我在想它是否超過了大小限制閾值 – ApolloSoftware 2013-03-20 15:02:25

+0

你可以嘗試將圖像寫入內存(緩衝區)並嘗試渲染恢復的圖像嗎?我試圖在內存中執行此操作,並且它可以很好地處理1024 x 683照片。以下是一些示例代碼:https://gist.github.com/abellina/5205633。 – abellina 2013-03-20 15:37:46

回答

3

我猜你只是想在一個時間你的緩衝區寫入的數據太多。做這樣的事情,以環比數據和塊發送,而不是:

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

太好了。我現在要使用它! – 2014-07-31 18:07:25

5

這是因爲你的圖像尺寸限制被突破。

處理此問題的更好方法是實現以下邏輯。

發件人

  1. 轉換UIimageNSData

  2. 拆分了NSData不同的數據塊(1024每塊被推薦)

  3. 發送&軌道NSData

    每塊

接收機

  1. 聲明NSData和存儲NSData塊(1024)到它,這是接收到的第一部分。

  2. 接收的NSData下一大塊並利用appendData:方法將其追加

  3. 一旦所有的塊被接收時,將接收到的NSData作爲UIImage

確保設計不同用於傳輸數據的結構,例如結構來表示細節(總塊,總大小,塊大小等),用於表示數據的結構(當前塊大小,當前塊數等),用於表示[R esponds數據(交付狀態,大塊數量交付等)。