Отправка UIImage через 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 ответа
Это из-за превышения вашего размера изображения.
Лучший способ справиться с этим - реализовать следующую логику.
отправитель
Перерабатывать
UIimage
вNSData
Разделить
NSData
на разные порции (рекомендуется 1024 на порцию)Отправить и отслеживать каждый кусок
NSData
Получатель
декларировать
NSData
и хранить первую частьNSData
кусок (1024) в него, который получен.Получите следующие куски
NSData
и использоватьappendData:
способ добавить егоКак только все чанки получены, преобразуйте полученные
NSData
какUIImage
Убедитесь, что вы спроектировали разные структуры для передачи данных в виде чанков, такие как структура для представления деталей (общий чанк, общий размер, размер чанка и т. Д.), Структура для представления данных (текущий размер чанка, текущий номер чанка и т. Д.) структура для представления данных ответов (статус доставки, номер чанка и т. д.).
Я предполагаю, что вы просто пытаетесь записать слишком много данных за раз для своего буфера. Сделайте что-то вроде этого, чтобы перебрать данные и отправить их порциями:
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