2013-03-20 17 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圧縮を試しましたか? (画像、0.4f) – ApolloSoftware

+0

サイズ制限の超過を超えているのだろうか – ApolloSoftware

+0

イメージをメモリ(バッファ)に書き込んで、復元されたイメージのレンダリングを試みることができますか?メモリでこれをやろうとしましたが、1024 x 683の写真でうまくいきました。サンプルコードは次のとおりです:https://gist.github.com/abellina/5205633 – abellina

答えて

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

素敵です。私は今それを使用するつもりです! –

5

それが原因であなたの画像サイズ制限のだが超過しています。

これを処理するためのより良い方法は、次のロジックを実装することです。

送信者

  1. UIimage異なるチャンクにNSDataを分割

  2. NSDataに変換します(チャンクあたり1024を推奨します)

  3. &トラックにNSData

    の各チャンクを送ります

レシーバ

  1. 受信され、NSDataを宣言し、それにNSDataチャンク(1024)の最初の部分を格納。

  2. NSData次のチャンクを受信し、作るの使用にそれを

  3. を追加するappendData:方法をすべてのチャンクが受信されると、UIImage

として受信NSDataを変換異なった設計にしてください(総チャンク、総サイズ、チャンクサイズなど)、データを表す構造(現在のチャンクサイズ、現在のチャンク番号など)、構造を表す構造などのチャンクとしてデータを転送するための構造rデータ(配信ステータス、配信されたチャンク番号など)を応答します。

関連する問題