无法使用 QuickLook 预览文件

Posted

技术标签:

【中文标题】无法使用 QuickLook 预览文件【英文标题】:Unable to preview files with QuickLook 【发布时间】:2021-10-24 17:47:46 【问题描述】:

我正在使用这个简单的工具来预览我的应用程序中的不同文件,但没有一个文件被成功预览。 我第一次尝试预览任何文件时,它会打开带有消息Unsupported file format 的预览控制器,而其他任何时候它只显示文件名和单词data(见图)。 这是实现(注意打印语句):

extension FileShareVC: QLPreviewControllerDataSource, QLPreviewControllerDelegate 
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int 
        filesList.count
    
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem 
        
        let url = NSURL(fileURLWithPath: filesList[index].filePath ?? "", isDirectory: false)
        print(filesList[index].filePath!)
        //prints file:///var/mobile/Containers/Data/Application/AB608864-C682-47BB-8396-2D456430879E/Documents/F9RIB62HBUAW.jpeg
        print("url: \(url)")
        //prints file:/var/mobile/Containers/Data/Application/AB608864-C682-47BB-8396-2D456430879E/Documents/F9RIB62HBUAW.jpeg -- file:///
        return url
    


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        tableView.deselectRow(at: indexPath, animated: true)
                  
        let quickLookViewController = QLPreviewController()
        quickLookViewController.dataSource = self
        quickLookViewController.delegate = self
        quickLookViewController.currentPreviewItemIndex = indexPath.row
        present(quickLookViewController, animated: true)
    

我不确定为什么我的网址会在文件路径上附加 -- file:///,这可能是导致问题的原因吗?

【问题讨论】:

因为 filesList 是具有属性 filepath 的 File 类的数组 在下面查看我的帖子 另请注意,您的应用已被沙盒化,并且每次启动时其位置都会发生变化。如果您需要保留该信息,则应仅保存其名称和目录,并在需要时重构您的 URL。 嗯,这是关于沙盒的非常好的信息,但我该如何改变呢?我现在将我的文件存储在 .libraryDirectory 中,然后将它们发送到 API。 API 会返回包含不再有效的文件路径的 filesList,对吗?解决办法是什么? 这取决于您是否有子文件夹。如果你不只是保存 lastPathComponent 【参考方案1】:

问题是您使用了错误的初始化程序。您正在将 absoluteString 传递给需要路径的初始化程序(您的字符串包含方案 file://)。顺便说一句,将 filePath 称为 absoluteString 具有误导性。

guard let url = URL(string: filesList[index].filePath ?? "") else 
    return // an alternate URL or a just create a fatalError

另请注意,您的应用已被沙盒化,其位置会在每次启动时发生变化。如果您需要保留该信息,则应仅保存其名称和目录,并在需要时重构您的 URL。


编辑更新:

请注意,您不应该将文件直接放在库文件夹中。 file system basics

【讨论】:

感谢里奥。我尝试了您提供的这个版本的 url,但结果仍然相同。也许问题出在您正在谈论的沙箱中。 ,但我该如何改变呢?我现在将我的文件存储在 .libraryDirectory 中,然后将它们发送到 API。 API 会返回包含不再有效的文件路径的 filesList,对吗?解决办法是什么? 最好的选择是在应用启动时获取目录的内容 所以如果我理解你的话,我应该只将 name.extension 发送给 API,因为我没有子文件夹。然后在尝试使用 API 返回给我的 name.extension 预览文件后,我应该尝试在目录中找到该文件(其路径),因为这部分“AB608864-C682-47BB-8396-2D456430879E”在每个应用程序上都在更改跑步吗? 但是我会将答案标记为正确,因为它解决了“file://”问题 这是正确的,但请检查文件系统基础链接。您应该使用应用程序支持文件夹。只需使用您的捆绑包 ID 在那里创建一个子文件夹并将您的文件放在那里。

以上是关于无法使用 QuickLook 预览文件的主要内容,如果未能解决你的问题,请参考以下文章

更喜欢我的 QuickLook 插件

QuickLook 空格键预览文件工具

将 QuickLook 预览生成委托给其他 QLPlugin

sh 使用OSX Finder Quicklook预览所有纯文本文件。方便的操作快捷方式需要为OSX Finder的Quick安装QLStephen插件

QuickLook 生成器音频

iOS PDF文件预览的几种方法