Estoy tratando de almacenar un objeto json que contiene información de configuración en un archivo de datos de aplicación de Google Drive. Actualmente estoy escribiendo la aplicación en JS que se ejecuta en el lado del cliente . Usando la API de Google Drive, actualmente puedo buscar el archivo en la carpeta appdata. ¿Cómo haría para generar un nuevo archivo y almacenarlo en la carpeta appdata si no se encuentra la configuración?
var request = gapi.client.drive.files.list({ 'q': '\'appdata\' in parents' }); request.execute(function(resp) { for (i in resp.items) { if(resp.items[i].title == FILENAME) { fileId = resp.items[i].id; readFile(); //Function to read file return; } } //Create the new file if not found });
El cliente gapi no proporciona un método para cargar archivos en Google Drive (lo hace para metadatos), pero aún exponen un punto final de API. Aquí hay un ejemplo que he estado usando para la API V3
function saveFile(file, fileName, callback) { var file = new Blob([JSON.stringify(file)], {type: 'application/json'}); var metadata = { 'name': fileName, // Filename at Google Drive 'mimeType': 'application/json', // mimeType at Google Drive 'parents': ['appDataFolder'], // Folder ID at Google Drive }; var accessToken = gapi.auth.getToken().access_token; // Here gapi is used for retrieving the access token. var form = new FormData(); form.append('metadata', new Blob([JSON.stringify(metadata)], {type: 'application/json'})); form.append('file', file); var xhr = new XMLHttpRequest(); xhr.open('post', 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id'); xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken); xhr.responseType = 'json'; xhr.onload = () => { console.log(xhr.response.id); // Retrieve uploaded file ID. callback(xhr.response); }; xhr.send(form); }
Y dado que Google Drive permitirá nombres de archivo duplicados ya que son únicos por ID, uso algo como esto para verificar si ya existe:
function fileExists(file, fileName){ var request = gapi.client.drive.files.list({ spaces: 'appDataFolder', fields: 'files(id, name, modifiedTime)' }); request.execute(function(res){ var exists = res.files.filter(function(f){ return f.name.toLowerCase() === fileName.toLowerCase(); }).length > 0; if(!exists){ saveFile(file, fileName, function(newFileId){ //Do something with the result }) } }) }
Consulte la documentación sobre el almacenamiento de datos de la aplicación :
La 'Carpeta de datos de la aplicación' es una carpeta especial a la que solo puede acceder su aplicación. Su contenido está oculto para el usuario y para otras aplicaciones. A pesar de estar oculta para el usuario, la carpeta de datos de la aplicación se almacena en la unidad del usuario y, por lo tanto, utiliza la cuota de almacenamiento de la unidad del usuario. La carpeta Datos de la aplicación se puede utilizar para almacenar archivos de configuración, datos de juegos guardados o cualquier otro tipo de archivo con el que el usuario no deba interactuar directamente.
Para poder utilizar su carpeta de datos de la aplicación, solicite acceso al siguiente ámbito:
https://www.googleapis.com/auth/drive.appdata
Si revisa el código de muestra sobre cómo insertar un archivo en la carpeta de datos de la aplicación (código PHP):
$fileMetadata = new Google_Service_Drive_DriveFile(array( 'name' => 'config.json', 'parents' => array('appDataFolder') )); $content = file_get_contents('files/config.json'); $file = $driveService->files->create($fileMetadata, array( 'data' => $content, 'mimeType' => 'application/json', 'uploadType' => 'multipart', 'fields' => 'id')); printf("File ID: %s\n", $file->id);
Al agregar appDataFolder
como padre para el archivo, se escribirá en appFolder. Luego implemente su propio código de carga/cody para insertar el archivo y su contenido en appFolder.
Espero que esto ayude