如何让QuickLook显示脱机文件?
我们的iPad应用程序可以显示文件,并在需要时离线保存。 我有一个名为DocumentViewController(从现在起名为DVC)的QLPreviewController子类来显示它们。
应用程序的工作stream程: – 用户单击文档的名称,DVC被推入显示文档。 – DVC离线下载文件并在完成时显示。 (所以HTTP URL被下载,离线存储,并且返回离线URL)
奇怪的是,只有PDF文件正在与脱机的url,其余的崩溃..(它适用于在线链接虽然)
我做了一些testing,当我把文件://在离线链接之前,应用程序不会崩溃,但DVC是关于文件的一些信息(就像它是一个Excel 97-2004文档)。
所以一些信息被转移,但我不知道是什么问题。
这里有一些截图,然后是一些代码。
代码: 请注意,Document是一个模型类,具有文档属性,如id,名称,文件types和url。
//DVC QLPreviewController dataSource method for returning url - (id <QLPreviewItem>) previewController: (QLPreviewController *) controller previewItemAtIndex: (NSInteger)index { [SaveHelper saveDocumentFileAndPropertyWithDocument:document]; //[SaveHelper getDocumentFileWithDocument:document]; without file:// //if I return document.documentUrl it is working with all files except iworks files) return [SaveHelper getDocumentFileAsPathWithDocument:document]; //with file:// } //SaveHelper methods + (NSString *)documentFilePathWithDocument:(Document *)document { return [[self documentFilePath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%d.%@", DOCUMENT_FILE_PREFIX, document.documentId, document.documentType]]; } + (NSURL *)saveDocumentFileAndPropertyWithDocument:(Document *)document { if([self saveDocumentPropertyWithDocument:document]) { return [self saveDocumentFileWithDocument:document]; } return nil; } + (NSURL *)saveDocumentFileWithDocument:(Document *)document { NSData *data = [NSData dataWithContentsOfURL:document.documentURL]; NSString *fullPath = [self documentFilePathWithDocument:document]; if([[NSKeyedArchiver archivedDataWithRootObject:data] writeToFile:fullPath atomically:YES]) { return [NSURL fileURLWithPath:fullPath]; } return nil; } + (NSURL *)getDocumentFileWithDocument:(Document *)document { return [NSURL fileURLWithPath:[self documentFilePathWithDocument:document]]; } + (NSURL *)getDocumentFileAsPathWithDocument:(Document *)document { return [NSURL fileURLWithPath:[@"file://" stringByAppendingPathComponent:[[self getDocumentFileWithDocument:document] absoluteString]]]; }
如果需要更多代码,请说。
编辑:
logging通过“getDocumentFileAsPathWithDocument”方法传递的URL时:
url: file:/var/mobile/Applications/xx-xx/Documents/documentFiles/file_20.pdf url: file:/var/mobile/Applications/xx-xx/Documents/documentFiles/file_80.docx
PDF文件正在工作而docx不在
当我尝试从本地存储中加载图像(jpg)时,出现以下错误消息:
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3.5 (8L1)/Symbols/System/Library/Frameworks/QuickLook.framework/DisplayBundles/Image.qldisplay/Image (file not found). warning: No copy of Image.qldisplay/Image found locally, reading from memory on remote device. This may slow down the debug session.
编辑:
webview不能与当地的url一起使用。 PDF是好的,但办公室文件给出了一个消息“无法读取文件,文件格式无效”。 iWorks文档与quicklook相同。 我认为它在格式的保存和加载的地方,我把它们作为一个NSDATA,但在此之后,没有任何提示,看看它是否是例如一个单词文件(只有扩展名)。
你还没有发布你的下载代码,但我相信问题在那里。 来自页面的文件(.pages扩展名)不是实际的文件,而是包 ,即包含文件并在Finder中显示为单个项目的目录(在Finder中查找.pages文件,右键单击并select“显示内容“)。 下载一个.pages文件实际上就像是下载一个目录:它依赖于web服务器得到了什么样的结果,但这很可能是一个错误页面。
您可以检测到它是一个.pages文件,并尝试手动下载其所有内容,但是您必须研究这些文件的结构以查看是否可能,因为您不太可能从一个文件请求目录的内容networking服务器。
.ppt和.xls文件的结果看起来很正常, 我认为iPad不太可能预览MS Office文档。
编辑:道歉,我刚刚阅读,iOS 可以预览MS Office文档。 也许文件在下载过程中受到某种程度的破坏? 您是否尝试将下载位置设置为应用程序的文档文件夹并启用iTunes文件共享? 这样,你可以下载一些文件,把它们从你的设备上拉下来,然后尝试在你的电脑上打开它,看看是否有效。
我们终于find了解决scheme!
我说得对,问题在于保存文件。
我需要改变保存方法在:
+ (NSURL *)saveDocumentFileWithDocument:(Document *)document { NSData *data = [NSData dataWithContentsOfURL:document.documentURL options:NSDataReadingUncached error:nil]; NSString *fullPath = [self documentFilePathWithDocument:document]; if([[NSFileManager defaultManager] createFileAtPath:fullPath contents:data attributes:nil]) { return [NSURL fileURLWithPath:fullPath]; } //OLD CODE // if([[NSKeyedArchiver archivedDataWithRootObject:data] writeToFile:fullPath atomically:YES]) // { // return [NSURL fileURLWithPath:fullPath]; // } return nil; }
所以用filemanager而不是用keyedarchiver保存它。
-
你有没有检查文件的大小在线上和线下都是一样的? 文件下载可能没有完成
-
尝试使用正常NSURL对象的MS Office文档的URL,并在UIWebView中打开。 那么它工作吗(所以我们知道它的文档或你的class级)?
-
尝试在getDocumentFileAsPathWithDocument中使用NSURL的fileURLWithPath:方法:返回的URL有可能是不正确的(虽然看起来不像日志,但是不会受伤)
首先,使用这个代码来确保你的文档在那里,因为我认为你的文档path引起的错误。
NSFileManager *fileManager=[NSFileManager defaultManager]; if([fileManager fileExistsAtPath:fullPath]){ NSLog(@"%@ exsit! ",fullPath); }else{ NSLog(@"%@ not exsit! ",fullPath); }
如果任何人有同样的问题,即使你做了以上所有的build议。 (我有同样的问题,当我从谷歌驱动器下载一些文件。)
尝试这个!
将文件扩展名的“x”结尾标识为格式的新版本。 (它只适用于'doc'和'ppt'文件,不适用于'xls'文件)是的,我知道这不是一个解决这个问题的适当的方法,但值得去尝试一下。
相信我,我尝试了一切!
希望你帮忙。