2016-07-05 36 views
2

我一直在試圖創建一個使用谷歌這個非常簡單的Web應用程序的JavaScript應用程序狀態驅動appDataFolder存儲和讀取它的狀態,在JSON格式。但是,v3驅動器api的文檔不包含有關如何輕鬆實現此功能的全面示例。使用谷歌驅動appDataFolder存儲在客戶端

到目前爲止,我能夠授權負荷谷歌驅動API,但我沒能創建配置JSON文件,如果它不存在,或更新其內容或讀取如果它存在。

我做的呼聲是:gapi.client.drive.files.get檢索配置JSON,gapi.client.drive.files.create創建配置JSON和GAPI。 client.drive.files.update更新其內容。

我一直在嘗試使用javascript Blob對象來表示我的文件及其內容,但沒有任何工作。

鑑於我有一個像例如的配置{測試:真正}字符串化和文件名我-app.json,我怎麼會叫gapi.client.drive.files API能夠到創建/更新/讀取這個配置?

檢索部分我試圖通過首先獲取應用程序文件夾中的文件列表,通過名稱匹配配置文件,獲取其ID,然後再次請求該文件使用ID。但由於我無法創建該文件,我不確定它是否有效。

代碼目前看起來是這樣的(重要的是要注意,此代碼得到建立和它在客戶端瀏覽器中運行,而不是在服務器上):

var config = require('../config/google-drive-config'); 
 

 
var authorize = function (immediate) { 
 
    return gapi.auth.authorize({ 
 
    'client_id': config.clientId, 
 
    scope: config.scopes.join(' '), 
 
    immediate: !!immediate 
 
    }); 
 
}; 
 

 
var loadDriveAPI = function() { 
 
    return gapi.client.load(
 
    config.apiName, 
 
    config.apiVersion 
 
); 
 
}; 
 

 
var loadAppDataFileId = function() { 
 
    return gapi.client.drive.files 
 
    .list({ 
 
     spaces: 'appDataFolder' 
 
    }) 
 
    .then(function(response) { 
 
     return _(response.files) 
 
     .find({ name: config.appDataFile }) 
 
     .get('id') 
 
     .value(); 
 
    }); 
 
}; 
 

 
var loadAppData = function (fileId) { 
 
    return gapi.client.drive.files 
 
    .get({ 
 
     'fileId': fileId 
 
    }); 
 
}; 
 

 
var saveAppData = function (appData, fileId) { 
 
    var resource = { 
 
    'name': config.appDataFile, 
 
    'parents': 'appDataFolder' 
 
    }; 
 

 
    var media = { 
 
    mimeType: 'application/json', 
 
    body: new Blob([JSON.stringify(appData)], { type: 'application/json' }) 
 
    }; 
 

 
    if (fileId) { 
 
    return gapi.client.drive.files 
 
     .update({ 
 
     fileId: fileId, 
 
     media: media 
 
     }); 
 
    } 
 

 
    return gapi.client.drive.files 
 
    .create({ 
 
     resource: resource, 
 
     media: media, 
 
     fields: 'id' 
 
    }); 
 
}; 
 

 
module.exports = { 
 
    authorize: authorize, 
 
    loadDriveAPI: loadDriveAPI, 
 
    loadAppDataFileId: loadAppDataFileId, 
 
    loadAppData: loadAppData, 
 
    saveAppData: saveAppData 
 
};

+0

我有完全一樣的問題。 我想更新我的文件,我有fileId。並有一些我希望存儲的json數據。 –

+0

歡迎使用stackoverflow。請參閱[如何編寫一個很好的stackoverflow問題](http:// stackoverflow。com/help/how-to-ask)來改善您的問題,向我們展示不起作用的創建代碼。 –

+0

是的,我意識到現在這個問題沒有正確制定。我會用我的代碼更新。感謝您的反饋@ZigMandel –

回答

4

進行大量的試驗後,和錯誤,我終於得到它的工作。我不能讓gapi.client.drive.files.update工作,但它與gapi.client.request工作:

var auth = function (immediate) { 
 
    return gapi.auth.authorize({ 
 
    'client_id': 'YOUR CLIENT ID GOES HERE', 
 
    // Permissions here can be more restrictive 
 
    scope: 'https://www.googleapis.com/auth/drive', 
 
    immediate: immediate 
 
    }); 
 
}; 
 

 
var silentAuth = function() { 
 
    return auth(true); 
 
}; 
 

 
var popupAuth = function() { 
 
    return auth(false); 
 
}; 
 

 
var loadDriveAPI = function() { 
 
    return global.gapi.client.load('drive', 'v3'); 
 
}; 
 

 
var getAppDataFile = function() { 
 
    return gapi.client.drive.files 
 
    .list({ 
 
     q: 'name="your-app-data-file-name.json"', 
 
     spaces: 'appDataFolder', 
 
     fields: 'files(id)' 
 
    }).then(
 
     function (data) { 
 
     if (_.isEmpty(data.result.files)) { 
 
      throw "no files found"; 
 
     } 
 

 
     return { 
 
      fileId: data.result.files[0].id 
 
     } 
 
     } 
 
    ); 
 
}; 
 

 
var createAppDataFile = function() { 
 
    return gapi.client.drive.files 
 
    .create({ 
 
     resource: { 
 
     name: 'your-app-data-file-name.json', 
 
     parents: ['appDataFolder'] 
 
     }, 
 
     fields: 'id' 
 
    }).then(function (data) { 
 
     return { 
 
     fileId: data.result.id 
 
     }; 
 
    }); 
 
}; 
 

 
var getAppDataFileContent = function (fileId) { 
 
    return gapi.client.drive.files 
 
    .get({ 
 
     fileId: fileId, 
 
     // Download a file — files.get with alt=media file resource 
 
     alt: 'media' 
 
    }).then(function (data) { 
 
     return { 
 
     fileId: fileId, 
 
     appData: data.result 
 
     }; 
 
    }); 
 
}; 
 

 
var saveAppData = function (fileId, appData) { 
 
    return gapi.client.request({ 
 
    path: '/upload/drive/v3/files/' + fileId, 
 
    method: 'PATCH', 
 
    params: { 
 
     uploadType: 'media' 
 
    }, 
 
    body: JSON.stringify(appData) 
 
    }); 
 
}; 
 

 
module.exports = { 
 
    silentAuth: silentAuth, 
 
    popupAuth: popupAuth, 
 
    loadDriveAPI: loadDriveAPI, 
 
    getAppDataFile: getAppDataFile, 
 
    createAppDataFile: createAppDataFile, 
 
    getAppDataFileContent: getAppDataFileContent, 
 
    saveAppData: saveAppData 
 
};

上述所有方法返回一個承諾。有上lodash

+0

我無法表達我對這個答案的感激之情。作品完美無缺,並解決了很多谷歌API文檔似乎無聲無息的問題。謝謝! – NoodlesFromHell

相關問題