在NSOutputStream上发送UIImage

Arm*_*han 9 xcode objective-c 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]];
Run Code Online (Sandbox Code Playgroud)

Sha*_* TK 5

这是因为您的图像大小限制被超出.

处理此问题的更好方法是实现以下逻辑.

寄件人

  1. 转换UIimageNSData

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

  3. 发送和跟踪每个块 NSData

接收器

  1. 声明NSData并将NSData块(1024)的第一部分存储到其中,并将其接收.

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

  3. 收到所有块后,将收到的转换NSDataUIImage

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


esc*_*ord 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
Run Code Online (Sandbox Code Playgroud)