9

ユーザーが撮影した画像をサーバーに送信しようとしています。JPEG 表現を取得し、それを写真のアップロードに必要な文字列に追加し、NSOutputStream を介してデータを送信します。ただし、サーバーから写真を取得しようとすると、上から 10% しか表示されません。どんな助けでも大歓迎です。

ところで。ソケットが開いており、接続されています。

これが私のコードです:

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]];
4

2 に答える 2

5

画像サイズの制限を超えているためです。

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

送信者

  1. UIimageに変換NSData

  2. NSDataを異なるチャンクに分割します (チャンクあたり 1024 をお勧めします)

  3. の各チャンクを送信して追跡するNSData

レシーバー

  1. 受信したチャンクの最初の部分 (1024) を宣言NSDataして格納します。NSData

  2. の次のチャンクを受け取り、メソッドをNSData使用appendData:して追加します

  3. すべてのチャンクが受信されたら、受信NSDataしたものをUIImage

詳細を表す構造 (合計チャンク、合計サイズ、チャンク サイズなど)、データを表す構造 (現在のチャンク サイズ、現在のチャンク番号など) など、データをチャンクとして転送するためのさまざまな構造を設計してください。 、応答データを表す構造 (配信ステータス、配信されたチャンク番号など)。

于 2013-03-20T17:11:20.503 に答える
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
于 2013-03-20T16:28:15.367 に答える