我正在尝试将用户带到服务器的图像发送给服务器。我得到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]];
答案 0 :(得分:5)
这是因为您的图片尺寸超出限制。
更好的方法是实现以下逻辑。
<强>发件人强>
将UIimage
转换为NSData
将NSData
拆分为不同的块(建议每块块1024个)
发送&amp;跟踪NSData
<强>接收机强>
声明NSData
并将NSData
chunk(1024)的第一部分存储到其中,然后收到。
接收NSData
的下一个块并使用appendData:
方法追加
收到所有块后,将收到的NSData
转换为UIImage
确保设计不同的结构以将数据传输为块(例如结构)以表示详细信息(总块,总大小,块大小等),表示数据的结构(当前块大小,当前块数等) ..),表示响应数据的结构(交付状态,交付的块数等)。
答案 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