【问题标题】:How to list files and folder in Google drive root folder如何列出谷歌驱动器根文件夹中的文件和文件夹
【发布时间】:2021-07-28 10:01:48
【问题描述】:

此代码用于在我的 iOS 应用中显示谷歌驱动器内容。现在我可以使用以下查询"mimeType ='\(mimeType)' or mimeType = 'application/vnd.google-apps.folder'" 登录并显示内容。

问题是它返回所有 mp3 文件,甚至是子文件夹中的文件,这不是我想要的。我想显示与谷歌驱动器根相同的结构。然后当用户进入任何子文件夹时,我会发送另一个请求来检索该子文件夹中的 mp3 文件。

那么我该如何重构这个查询来实现呢?

// 过滤/搜索谷歌驱动文件的代码。

import Foundation
import GoogleAPIClientForREST

class GoogleDriveAPI {
    private let service: GTLRDriveService
    
    init(service: GTLRDriveService) {
        self.service = service
    }
    
    public func search(_ mimeType: String, onCompleted: @escaping ([GTLRDrive_File]?, Error?) -> ()) {
        let query = GTLRDriveQuery_FilesList.query()
        query.pageSize = 100
        query.q = "mimeType ='\(mimeType)' or mimeType = 'application/vnd.google-apps.folder'"
        self.service.executeQuery(query) { (ticket, results, error) in
            onCompleted((results as? GTLRDrive_FileList)?.files, error)
        }
    }

【问题讨论】:

    标签: ios swift google-drive-api


    【解决方案1】:

    如果您使用mimeType = 'application/vnd.google-apps.folder',那么您就是在告诉它您只需要文件夹或特定的 mime 类型。

    如果您执行'root' in parents",它将返回所有带有根目录的父文件夹。

    因此,如果您执行'root' in parents" and mimeType = 'application/vnd.google-apps.folder',您将获得所有具有 root 父文件夹的文件夹。

    【讨论】:

    • 哦!我认为'root' in parents" 表示根文件夹中的所有内容,尽管这个表达是模棱两可的。乍一看真的让我很困惑,它就像根在它的父母中,而根的父母是谁?好的,我从你那里得到了主意,谢谢。我应该把它分成两个步骤,请在回答中查看我的更新。
    【解决方案2】:

    根据 DalmTo 的回答,我已经更改了代码并进行了一些测试。现在我得到了我想要的。

    简而言之,我将列表文件分为两个步骤,首先使用 query = 'root' in parents" 进行搜索,它将列出根文件夹中的所有内容。然后在将该数据源传递给另一个 ViewController 之前,我执行一个过滤器 files?.filter { $0.mimeType == "audio/mpeg" || $0.mimeType == "application/vnd.google-apps.folder"}

    为此,我在根目录中获取每个文件夹和在根目录中的每个 mp3 文件,其他类型的文件被忽略。然后,如果用户在根目录中输入一个文件夹,我会执行另一个 http 请求(文件列表)来获取其内容。

    谷歌驱动API函数。
    import Foundation
    import GoogleAPIClientForREST
    
    class GoogleDriveAPI {
        private let service: GTLRDriveService
        
        init(service: GTLRDriveService) {
            self.service = service
        }
        
        public func search(onCompleted: @escaping ([GTLRDrive_File]?, Error?) -> ()) {
            let query = GTLRDriveQuery_FilesList.query()
            query.pageSize = 100
            // query.q = "mimeType ='\(mimeType)' or mimeType = 'application/vnd.google-apps.folder'"
            query.q = "'root' in parents"
            self.service.executeQuery(query) { (ticket, results, error) in
                onCompleted((results as? GTLRDrive_FileList)?.files, error)
            }
        }
    

    从 ViewController 调用 api,然后我放了一个在这里位上下文以使其清楚。

        override func viewDidLoad() {
            super.viewDidLoad()
            view.backgroundColor = .gray
            
            setViews()
            
            // add an observer on notification "userDidSignInGoogle"
            NotificationCenter.default.addObserver(self, selector: #selector(userDidSignInGoogle), name: .signInGoogleCompleted, object: nil)
            
            setUpGoogleSignIn()
        }
        
        func setUpGoogleSignIn() {
            GIDSignIn.sharedInstance().delegate = self
            GIDSignIn.sharedInstance().uiDelegate = self
            GIDSignIn.sharedInstance().scopes = [kGTLRAuthScopeDrive]
            GIDSignIn.sharedInstance().signInSilently()
        }
        
        // MARK: - Notification
        @objc private func userDidSignInGoogle(_ notification: Notification) {
            // Update screen after user successfully signed in
            updateScreen()
            print("userDidSignInGoogle")
            listAudioFilesAndFolders()
        }
    
        func listAudioFilesAndFolders() {
            self.googleAPIs?.search(onCompleted: { files, error in
                guard error == nil, files != nil else {
                    print("Err: \(String(describing: error))")
                    return
                }
                
                self.dismiss(animated: true) {
                    let vc = GoogleDriveFilesViewController()
                    // filter the files before passing it.
                    vc.audioFilesAndFolders = files?.filter { $0.mimeType == "audio/mpeg" || $0.mimeType == "application/vnd.google-apps.folder"}
                    UIApplication.getTopMostViewController()?.present(vc, animated: true)
                }
            })
        }
    

    【讨论】:

      猜你喜欢
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多