Отправка 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 ответа

Это из-за превышения вашего размера изображения.

Лучший способ справиться с этим - реализовать следующую логику.

отправитель

  1. Перерабатывать UIimage в NSData

  2. Разделить NSData на разные порции (рекомендуется 1024 на порцию)

  3. Отправить и отслеживать каждый кусок NSData

Получатель

  1. декларировать NSData и хранить первую часть NSData кусок (1024) в него, который получен.

  2. Получите следующие куски NSData и использовать appendData: способ добавить его

  3. Как только все чанки получены, преобразуйте полученные 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
Другие вопросы по тегам