在NSOutputStream上发送UIImage

时间:2013-03-20 14:52:27

标签: objective-c xcode nsstream nsoutputstream

我正在尝试将用户带到服务器的图像发送给服务器。我得到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]];

2 个答案:

答案 0 :(得分:5)

这是因为您的图片尺寸超出限制。

更好的方法是实现以下逻辑。

<强>发件人

  1. UIimage转换为NSData

  2. NSData拆分为不同的块(建议每块块1024个)

  3. 发送&amp;跟踪NSData

  4. 的每个块

    <强>接收机

    1. 声明NSData并将NSData chunk(1024)的第一部分存储到其中,然后收到。

    2. 接收NSData的下一个块并使用appendData:方法追加

    3. 收到所有块后,将收到的NSData转换为UIImage

    4. 确保设计不同的结构以将数据传输为块(例如结构)以表示详细信息(总块,总大小,块大小等),表示数据的结构(当前块大小,当前块数等) ..),表示响应数据的结构(交付状态,交付的块数等)。

答案 1 :(得分: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