【问题标题】:iPhone PLIST File Upload coming out BinaryiPhone PLIST 文件上传二进制文件
【发布时间】:2011-07-21 16:55:27
【问题描述】:

我有一个内置在 Objective C 中的 iPhone 应用程序,它可以将 PLIST 文件从 iPhone 上传到服务器。大多数时候它工作得很好,但有时文件看起来像这样

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]];

【问题讨论】:

  • 请贴出写出二进制文件的代码。它会给我们一些东西去继续
  • 这很奇怪,PLIST 以 XML 形式出现在应用程序中。我可以发布上传 PLIST 的代码。

标签: iphone objective-c ios


【解决方案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

【讨论】:

  • 有趣的是大多数 plist 文件已经以 XML 形式出现,但有些是以二进制形式出现的。我不知道会发生什么。
【解决方案2】:

在项目/目标构建设置中有设置“属性列表输出编码”,它控制大多数 plist 的输出格式:二进制、xml、与输入相同。

您还可以修改特定文件的类型。在 XCode 3.x 中,在上下文菜单的 Get Info 下。在 XCode 4 - 左侧面板“实用程序” - 文件检查器 - 身份和类型 - 文件类型。 纯 XML 类型在所有情况下都应保持文件原样。

如果您从代码生成 plist,您可以使用 NSPropertyListXMLFormat_v1_0 格式而不是 NSPropertyListBinaryFormat_v1_0 进行 xml 输出。

【讨论】:

  • 贴出的代码用于将plist从应用程序文档目录上传到服务器。目前还不清楚您如何将 plist 文件放入该目录。
【解决方案3】:

plist 可以有三种格式,纯文本、xml 或二进制格式。

二进制格式的优点是在 iphone 上加载或保存时可以更快地处理。

我不认为你可以控制使用哪种格式,这取决于你用来编写什么函数,但是 perl、python 或 php 中的脚本也可以解析二进制 plist。

对于 python 看https://github.com/farcaller/bplist-python

php 看https://github.com/rodneyrehm/CFPropertyList

【讨论】:

    【解决方案4】:

    您要上传捆绑包中的现有 .plist 吗?因为项目中的所有 .plist 都转换为二进制格式。我将使用CFPropertyListWrite 创建您从头上传到服务器的任何.plist,并将格式设置为kCFPropertyListXMLFormat_v1_0。然后将生成的文件上传到您的服务器。这样一来,您就不会依赖包中的格式。

    【讨论】:

    • AHHH 我想就是这样。我已经在捆绑包中有 PLIST,但我不明白为什么它们通常以 XML 格式出现。
    • 我认为您应该编辑您的问题并添加一些加载 .plist 的代码以将其发送到服务器。因此,通过更多的眼睛查看代码,我们可以提供更好的答案。
    • 我发布了代码。我的赏金今天将用完,我相信您提供了正确的答案,但任何关于代码的见解都会很好。
    • 我会在几个小时后到家时再详细看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多