Как отправить правильно сформированный ответ HTTP в сокеты Какао? - PullRequest
1 голос
/ 12 ноября 2011

Я делаю приложение, которое включает в себя встроенный HTTP-сервер.Мне нужно отправить изображение PNG через сокет, но каким-то образом это портится, и изображение просто не появляется.Это мой код (я использую AsyncSockets):

if(processingURL == FALSE) {

        NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Contents/Resources/public%@",[self getApplicationPath], [request objectAtIndex:1]];
        //NSLog(@"%@", filePath);


        if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
            contententType = @"image/png";
            responseCode = @"200 OK";
         //   responseBody = [[NSString alloc] initWithData:[[NSFileManager defaultManager] contentsAtPath:filePath] encoding:NSASCIIStringEncoding];

            NSData * content = [[NSData alloc] initWithContentsOfFile:filePath];

            responseBody = [[NSString alloc] initWithData:content encoding:NSASCIIStringEncoding];

            NSLog(@"%@",responseBody);

        }
    }

    data = [[NSString stringWithFormat:@"HTTP/1.1 %@\nContent-Type: %@\n\n\n %@", responseCode, contententType, responseBody] dataUsingEncoding:NSUTF8StringEncoding];


    [sock writeData:data withTimeout:-1 tag:0];

Что я делаю не так?Я думаю, что проблема в ответе, который искажен, но я не знаю, спасибо:)

1 Ответ

1 голос
/ 13 ноября 2011
responseBody = [[NSString alloc] initWithData:content encoding:NSASCIIStringEncoding];

Не обрабатывать произвольные данные содержимого файла как текст. Это не так.

PNG не является текстовым файлом ASCII; он содержит двоичные данные, которые вы должны обрабатывать как таковые. Это означает, что нужно оставаться с NSData на протяжении всего пути, и ни в коем случае не пытаться преобразовать его или интерпретировать как текст для строки NSString.

Единственная строка, которую вы должны создать, - это код ответа и заголовки. Создайте данные из этой строки, затем объедините данные из файла и отправьте их на сервер.

...