从客户端到服务器传输PDF文件时出现问题

时间:2011-12-06 22:41:41

标签: iphone objective-c ios xcode ipad

我已经实现了从Windows桌面应用程序转移到iPhone App的客户端 - 服务器。我使用NSStream轮询模式以不同的格式传输数据,但总是作为字符串传输:

    if([inputStream hasBytesAvailable]) {
        len = [inputStream read:buffer maxLength:sizeof(buffer)];
        if (len > 0) {
            NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
            if (nil != output) {
                [_arrRisposta addObject:output];
                _strRisposta = [NSMutableString stringWithString: output];
            }
        }
        else {
            break;
        }
    }

一切都很完美,但是当我传输PDF文件并保存时,文件就不一样了。当我在UIWebView中加载文件时,页面数是正确的,但没有内容。我保存文件如下:

                NSFileManager *fileManager = [NSFileManager defaultManager];
                NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                NSString *docDir = [paths objectAtIndex:0];
                NSString *dataFile = [docDir stringByAppendingPathComponent:[NSString stringWithFormat:@"temp.%@", @"pdf"]];

                if ([fileManager fileExistsAtPath:dataFile]) {
                    [fileManager removeItemAtPath:dataFile error:nil];
                }
                [_strContenuto writeToFile:dataFile atomically:YES encoding:NSUTF8StringEncoding error:nil];

                NSURL *fileUrl = [NSURL fileURLWithPath:dataFile];
                [webModello loadRequest:[NSURLRequest requestWithURL:fileUrl]];

怎么了?我试图改变字符串的编码,但我还没有解决。如果我将传输的文件与原始文件进行比较,则有些字符不匹配。 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

你不应该使用字符串。更改代码以使用NSData对象。 PDF文件不是字符串,并且有各种各样的编码问题,你不必担心这会使用字符串(如果有的话)。

我没有查找NSData的确切api用法,这一切都来自我的脑海......所以不要复制并粘贴它!

// Somewhere in your code
 _myData = [[NSMutableData alloc] init];

// when data comes in....

 if([inputStream hasBytesAvailable]) {
    len = [inputStream read:buffer maxLength:sizeof(buffer)];
    if (len > 0) {
           [_myData addBytes:buffer length:len];
        }
    }
    else {
        break;
    }
}

// when the callback comes in saying all data  there:
 [_myData writeToFile:@"path/topdf/file.pdf" atomically:YES];