2011-03-23 71 views
2

我有一个iPhone应用程序内置的Objective C上传PLIST文件从iPhone到服务器。大多数时候,它完美的作品,但有时文件看起来像这样iPhone PLIST文件上传出来二进制

bplist00Ú ..... 

我发现,这显然是一个二进制PLIST,但我想不通为什么会发生。

有什么想法?

NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:fileName]; 
NSData *data = [[NSData alloc] initWithContentsOfFile:path]; 

// Location ID doesn't seem to be correct here - always 0? 
NSMutableString *urlString = [NSMutableString string]; 
[urlString appendString:[NSString stringWithFormat:@"http://www.website.com/app/iphone/submitjob/upload?jid=%i&mid=%@&lid=%i", delegate.jobInProgress.jobID, delegate.memberID, [[delegate.jobInProgress.plist objectForKey:@"locationID"] intValue]]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

NSString *boundary = @"---------------------------14737809831466499882746641449"; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 

[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *postbody = [NSMutableData data]; 
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", fileName] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[postbody appendData:[NSData dataWithData:data]]; 
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:postbody]; 

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 
returnString = [returnString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
+1

请发布写出二进制代码。它会给我们一些东西去继续 – MCannon 2011-03-23 22:59:07

+0

这是很奇怪的部分,PLIST作为XML进入应用程序。我可以发布上传PLIST的代码。 – 2011-03-25 13:58:18

回答

2

你上载现有的.plist是在捆绑?因为项目中的所有.plist都转换为二进制格式。我将使用CFPropertyListWrite创建您从头开始上传到服务器的任何.plist,并将格式设置为kCFPropertyListXMLFormat_v1_0。然后将生成的文件上传到您的服务器。这样,你不依赖于它在捆绑中的格式。

+0

AHHH我认为就是这样。我已经在软件包中使用了PLIST,但是我不明白为什么它们通常以XML格式来完成。 – 2011-04-12 16:12:14

+0

我认为你应该编辑你的问题,并添加一些代码,你加载.plist发送到服务器。因此,用更多的眼睛看代码,我们可以提供更好的答案。 – 2011-04-12 16:47:06

+0

我发布了代码。我的赏金将在今天结束,我相信你已经提供了正确的答案,但是对代码的任何洞察都会很好。 – 2011-04-15 16:19:01

1

我认为Xcode经常会将Info.plist文件转换为二进制格式。这可能取决于你在做什么样的构建,例如我有一个含糊的内存,签名构建可能需要一个二进制PLIST而不是XML,但我不确定。

仅供参考,您可以使用plutil到PLIST转换和从二进制/ XML格式:

plutil -convert xml1 <binary plist file> 
plutil -convert binary1 <XML plist file> 

您还可以使用PlistBuddy操作PLIST文件,使用-x选项写出来的XML。这里的手册页PlistBuddy:
http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/PlistBuddy.8.html

+0

有趣的是,大部分plist文件都是以XML的形式出现的,但有些则以Binary形式出现。我无法弄清楚会发生什么。 – 2011-03-24 20:41:13

0

还有的设置“属性列表输出编码”,在项目/目标建立控制输出格式对于大多数的Plist设置:二进制XML,同作为输入。

而且您还可以修改特定文件的类型。在上下文菜单中的获取信息下的XCode 3.x中。在XCode 4中 - 左侧面板“实用工具” - 文件检查器 - 标识和类型 - 文件类型。 纯XML类型应该在所有情况下保留文件。

如果您从代码生成plists,则可以使用NSPropertyListXMLFormat_v1_0格式代替NSPropertyListBinaryFormat_v1_0进行xml输出。

+0

我会检查一下。 – 2011-04-12 16:11:34

+0

发布代码用于将plist从应用程序文档目录上传到服务器。目前还不清楚你如何将plist文件放入该目录。 – 2011-04-20 10:45:52