我有一个选择图像的选择器,我尝试了具有< 131768字节。因此,当我尝试使用大字节(例如:300000字节)的图像时,OutputStream无法将数据写入流。在输出流中写入大数据的正确方法是什么。感谢高级。这是我的代码
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self openStream];
UIImage *image = info[UIImagePickerControllerOriginalImage];
NSData *imgData = UIImageJPEGRepresentation(image,0.4f);
NSInteger writeResult = 0;
// imgData.leng = 300000k
// Image data only send <131768 bytes
NSMutableData *completeData = [[NSMutableData alloc]init];
[completeData appendData:imgData];
NSInteger bytesWritten = 0;
while ( completeData.length > bytesWritten )
{
writeResult += [self.outputStream write:[completeData bytes]+bytesWritten maxLength:[completeData length]-bytesWritten];
//sending NSData over to server
NSLog(@"WRITE RESULT : %ld",(long)writeResult);
if ( writeResult == -1 )
NSLog(@"error code here");
else
bytesWritten += writeResult;
if (bytesWritten == writeResult) {
// Dismiss view when byteswritten == writeresult
[self dismissViewControllerAnimated:YES completion:nil];
}
}
}
和ReceiveServer代码
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
// An NSStream delegate callback that's called when events happen on our
// network stream.
{
switch (eventCode) {
case NSStreamEventOpenCompleted: {
NSLog(@"NSStreamEventOpenCompleted");
} break;
case NSStreamEventHasBytesAvailable: {
uint8_t buffer[1035];
// Pull some data off the network.
NSInteger bytesRead = [self.networkStream read:buffer maxLength:sizeof(buffer)];
// Get data from client
self.dataa = [NSData dataWithBytes:buffer length:bytesRead];
/* Sub data string to define image/video/string
ffd8ff is JPEG data
62706c is String Data */
NSString *dataString = [NSString stringWithFormat:@"%@",self.dataa];
NSString *subDataString = [dataString substringWithRange:NSMakeRange(1, 6)];
// If data string equal define Image string
if ([subDataString isEqualToString:kDefineImageString]) {
self.isImage = YES;
// check input stream
if (aStream == self.networkStream) {
// append the data at the top to define type
[sharedManager.pictureMutableData appendData:self.dataa];
int len;
// while Input stream available to read
while ([self.networkStream hasBytesAvailable]) {
// read buffer with length
len = [self.networkStream read:buffer maxLength:sizeof(buffer)];
// if length of buffer > 0 append data to sharedManager.pictureMutableData (a mutable data to store all data of UIImage )
if (len > 0) {
NSData *pictureData = [NSData dataWithBytes:buffer length:len];
[sharedManager.pictureMutableData appendData:pictureData];
}
}
}
}
// When done save image if data is UIImage , if string data do nothing
case NSStreamEventHasSpaceAvailable: {
if (self.isImage == YES) {
//send image data
[self _didReceiveDataImage:sharedManager.pictureMutableData];
self.isImage == NO;
}
else if (self.isString == NO)
{
// Do nothing
}
} break;
case NSStreamEventErrorOccurred: {
[self _stopReceiveWithStatus:@"Stream open error"];
} break;
// Close stream when end
case NSStreamEventEndEncountered:
{
[aStream close];
[aStream removeFromRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
aStream = nil; // stream is ivar, so reinit it
break;
// NSMutableData *dataImageMut = [NSMutableData dataWithData:dataImage];
// [self _didReceiveDataImage:dataImageMut];
} break;
default: {
} break;
}
答案 0 :(得分:0)
您的写例程有很多问题:
你在哪里
writeResult += [self.outputStream write:[completeData bytes]+bytesWritten maxLength:[completeData length]-bytesWritten];
你想要:
writeResult = [self.outputStream write:[completeData bytes]+bytesWritten maxLength:[completeData length]-bytesWritten];
如果writeResult
为-1,则您希望立即return
。
现在,如果bytesWritten
等于writeResult
,您就会解雇拣货员。这并没有多大意义。我会完全取消for
循环中的选择器,并确保你无论如何解雇它。
另外,我个人建议不要直接检索资产的数据,而不是获得低分辨率的JPEG表示。见https://stackoverflow.com/a/25322412/1271826。
这可确保您不会丢失质量和/或更改文件大小。它也更有效地使用内存。