有没有比我的实现更好的方法来检查更新的文件?

Posted

技术标签:

【中文标题】有没有比我的实现更好的方法来检查更新的文件?【英文标题】:Is there a better way to check for a newer file than my implementation? 【发布时间】:2012-11-25 18:17:43 【问题描述】:

我有一个应用程序可以下载每隔几个月更新一次的 PDF,每次下载某个 PDF 时,我还会下载一个包含一个字符的 .txt 文件。每次我在服务器上上传更新的 PDF 时,我也会将服务器上 .txt 文件中的字符数加一。

当用户在我的应用程序中点击“更新”按钮时,我会将来自服务器的 .txt 文件中的字符串与本地 .txt 文件的字符串进行比较。

这是一种非常轻量级的检查新 PDF 是否可用的方法,但我想问是否有更好的方法或更轻松的方法来执行此操作,而无需为我创建的每个 PDF 文件创建一个 .txt 文件我的服务器上有吗?

提前感谢您提供的任何帮助!

这是我用来检查新 PDF 的代码:

NSString *documentDirectory = [(AppDelegate *)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory];

NSString *path = [documentDirectory stringByAppendingPathComponent:@"test.txt"];

NSString *server = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"foo.com/test.txt"] encoding:NSASCIIStringEncoding error:nil];

NSString *local = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:nil];

if(![local isEqualToString:server])

   // I Download the new PDF and the new .txt file here;
   // simple NSURLConnection stuff, no need to elaborate

【问题讨论】:

【参考方案1】:

在我的脑海中,HTTP HEAD 方法可用于仅获取标头而不是数据。如果标题中的创建日期晚于您下载数据的最后日期,则该获取新副本了。这可以通过NSURLRequestNSURLConnection 完成。

如果您的服务器不支持HEAD 请求或其他原因阻止了它的使用,您可以有第二个 TXT 文件,其中包含版本/哈希/唯一标识符。下载它并与存储的值进行比较。如果更改,请下载完整的 PDF 并将版本文本文件保存到磁盘以供以后参考。

如果安全是一个问题并且您需要能够信任服务器,请在任一情况下使用 HTTPS。

【讨论】:

对于大约 100 兆字节的大型 PDF,http HEAD 响应有多轻量级?另外,我使用 Amazon 的 S3 进行存储。 HEAD 请求非常快,因为响应没有真实数据,只有 HTTP 标头 真正的问题是,如何将 HEAD 请求与存储的本地 PDF 文件中的某种元数据进行比较? @aviatorken89 愿意分享吗?我在 objc 中寻找可以检查服务器上 pdf 文件的修改日期的东西。 @Jorgen,我使用了 S3 上可用的 Etag 属性。我只是存储了所有 Etag 的本地 plist,然后进行比较。 ` NSString *serverETag = [[(NSHTTPURLResponse *)response allHeaderFields] objectForKey:@"Etag"];`

以上是关于有没有比我的实现更好的方法来检查更新的文件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来更新 tx 哈希?

PHP 有没有比使用标题(位置)更好的方法来保护我的页面?

有没有更好的方法来检查一个数字是不是是两个数字的范围

检查文件是不是更新

如何在 Swift 2.0 中检查 UITextField 是不是为空白?有没有更好的方法来计算字符串? [复制]

如何有效地将结构向量写入文件?