【问题标题】:Iterating Google Drive files using API for metadata使用元数据 API 迭代 Google Drive 文件
【发布时间】:2017-01-13 13:46:10
【问题描述】:

我想显示驱动器文件元数据

"图标链接", “缩略图链接”

驱动器中的每个文件,但仅获取类型、id、名称、mimeType 等字段的输出。而其他字段不显示。

function loadDriveApi() {
    gapi.client.load('drive', 'v3', listFiles);
}

function listFiles() {
    var request = gapi.client.drive.files.list({});

    request.execute(function(resp) {
        var files = resp.files;
        if (files && files.length > 0) {
            for (var i = 0; i < files.length; i++) {
                var file = files[i];
                appendPre(file.iconLink);
            }
        } else {
            appendPre('No files found.');
        }
    });
}

【问题讨论】:

    标签: javascript google-drive-api drive google-drive-realtime-api


    【解决方案1】:

    至少您需要范围:https://www.googleapis.com/auth/drive.metadata.readonly + OAuth (API-Key & Client-ID)

    您可以在以下位置进行测试:https://developers.google.com/drive/v3/reference/files/list

    在“字段”输入中添加:files(iconLink,thumbnailLink)

    如果您使用https://apis.google.com/js/api.js,请务必将您的域添加到 API-Key -> HTTP-Referrer & Client-ID -> JavaScript-Source & Forwarding-URI (@https://console.developers.google.com/apis/credentials)

    您可以在此处找到基本的 gapi 使用示例:https://github.com/google/google-api-javascript-client/blob/51aa25bed4f6c36d8e76fd3b9f7e280ded945c98/samples/loadedDiscovery.html

    我前段时间承诺了 gapi 客户端,因为我不喜欢在方法中混合使用回调和 thenables。这对我有用(假设 api.js 已经加载),但在回应。

    window.gapiPromisified = {
      apiKey: 'XXXXXXXXXXX',
      clientId: 'XXXXX-XXXXXX.apps.googleusercontent.com'
    }
    
    window.gapiPromisified.init = function init () {
      return new Promise(resolve => {
        gapi.load('client:auth2', () => {
          if (!document.getElementById('gapiAuthButton')) {
            let authButton = document.createElement('button')
            authButton.id = 'gapiAuthButton'
            authButton.style.display = 'none'
            authButton.style.marginLeft = 'auto'
            authButton.style.marginRight = 0
            document.body.insertBefore(authButton, document.body.firstChild)
            authButton.addEventListener('click', () => {
              let GoogleAuth = gapi.auth2.getAuthInstance()
              if (GoogleAuth.isSignedIn.get()) {
                GoogleAuth.signOut()
              } else {
                GoogleAuth.signIn()
              }
            })
          }
          gapi.client.setApiKey(this.apiKey)
          gapi.auth2.init({ client_id: this.clientId })
          .then(() => resolve())
        })
      })
    }
    
    window.gapiPromisified.signIn = function signIn () {
      return new Promise(resolve => {
        let GoogleAuth = gapi.auth2.getAuthInstance()
        // Listen for sign-in state changes
        GoogleAuth.isSignedIn.listen(isSignedIn => {
          let authButton = document.getElementById('gapiAuthButton')
          if (isSignedIn) {
            authButton.textContent = 'Sign-out'
            resolve()
          } else {
            authButton.textContent = 'Sign-in'
          }
        })
        // Handle the initial sign-in state
        let authButton = document.getElementById('gapiAuthButton')
        let isSignedIn = GoogleAuth.isSignedIn.get()
        authButton.textContent = (isSignedIn) ? 'Sign-out' : 'Sign-in'
        document.getElementById('gapiAuthButton').style.display = 'block'
        if (isSignedIn) {
          resolve()
        } else {
          GoogleAuth.signIn()
        }
      })
    }
    
    window.gapiPromisified.getReady = function getReady () {
      if (!gapi.hasOwnProperty('auth2')) {
        return this.init()
        .then(() => this.signIn())
      } else {
        if (gapi.auth2.getAuthInstance().isSignedIn.get()) {
          return Promise.resolve()
        } else {
          return this.signIn()
        }
      }
    }
    
    window.gapiPromisified.getScopes = function getScopes (scopes) {
      return new Promise((resolve, reject) => {
        let GoogleUser = gapi.auth2.getAuthInstance().currentUser.get()
        if (GoogleUser.hasGrantedScopes(scopes)) {
          resolve()
        } else {
          // method returns goog.Thenable
          GoogleUser.grant({ 'scope': scopes })
          .then(onFulfilled => {
            resolve(onFulfilled)
          }, onRejected => {
            reject(onRejected)
          })
        }
      })
    }
    
    window.gapiPromisified.loadAPI = function loadAPI (urlOrObject) {
      return new Promise((resolve, reject) => {
        // method returns goog.Thenable
        gapi.client.load(urlOrObject)
        .then(onFulfilled => {
          resolve(onFulfilled)
        }, onRejected => {
          reject(onRejected)
        })
      })
    }
    
    window.gapiPromisified.metadata = function metadata () {
      return new Promise((resolve, reject) => {
        this.getReady()
        .then(() => this.getScopes('https://www.googleapis.com/auth/drive.metadata.readonly'))
        .then(() => this.loadAPI('https://www.googleapis.com/discovery/v1/apis/drive/v3/rest'))
        .then(() => {
          gapi.client.drive.files.list({
            fields: 'files(iconLink,thumbnailLink)'
          })
          .then(onFulfilled => {
            resolve(onFulfilled)
          }, onRejected => {
            reject(onRejected)
          })
        })
      })
    }
    
    window.gapiPromisified.metadata()
    .then(res => {
      res.result.files.forEach(file => {
        console.log(file.iconLink)
        console.log(file.thumbnailLink)
      })
    })
    

    【讨论】:

      【解决方案2】:

      在 v3 中,您需要指定要包含在元数据响应中的字段。见fields=参数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        相关资源
        最近更新 更多