google files activate javascript google-api google-drive-sdk

files - Cómo usar Google Drive API para descargar archivos con Javascript



upload file php google drive (3)

Quiero descargar archivos de Google Drive con la API de JavaScript. gapi.client.drive.files autenticar y cargar la lista de archivos usando la solicitud gapi.client.drive.files . Sin embargo, me quedé atrapado en la descarga de esos archivos.
Mi intento de descargar el archivo:

var request = gapi.client.drive.files.get({ fileId:id, alt:''media'' }); request.execute(function(resp){ console.log(resp); });

Tengo estos errores al intentar ejecutar lo anterior:

(403) The user has not granted the app 336423653212 read access to the file 0B0UFTVo1BFVmeURrWnpDSloxQlE. (400) Bad Request

Reconozco que los archivos que no son archivos de Google Drive (Google Doc, Google Slide) devuelven el error 403.
Soy nuevo en esto. Cualquier ayuda y respuesta es realmente apreciada.

Actualización 0

De la documentación de Google Drive sobre el manejo de errores de la API , aquí hay una parte de la explicación de 400 errors

Esto puede significar que no se ha proporcionado un campo o parámetro obligatorio, que el valor proporcionado no es válido o que la combinación de campos proporcionados no es válida.

Esto es porque tengo alt:''media'' en mi objeto de parámetro.

gapi.client.drive.files.export , pero tampoco funciona y devuelve (403) Insufficient Permission aunque mi cuenta de Google Drive tiene permiso de edición para esos archivos. Aquí está mi código:

var request = gapi.client.drive.files.get({ fileId:element.id, }); request.then(function(resp){ console.log(resp.result); type = resp.result.mimeType; id = resp.result.id; var request = gapi.client.drive.files.export({ fileId:id, mimeType:type }) request.execute(function(resp){ console.log(resp); }); });

Actualización 1

Basado en la respuesta de abielita , he intentado hacer una solicitud HTTP autorizada pero no descarga el archivo. En realidad, devuelve la información del archivo en response y el atributo responseText en el objeto XMLHttpRequest .

function test() { var accessToken = gapi.auth.getToken().access_token; var xhr = new XMLHttpRequest(); xhr.open("GET", "https://www.googleapis.com/drive/v3/files/"+''1A1RguZpYFLyO9qEs-EnnrpikIpzAbDcZs3Gcsc7Z4nE'', true); xhr.setRequestHeader(''Authorization'',''Bearer ''+accessToken); xhr.onload = function(){ console.log(xhr); } xhr.send(''alt=media''); }

______________________________________________________

Descubrí que puedo recuperar URLs de todos esos archivos de la carpeta usando los atributos webViewLink o webViewContent archivos.

  • Un archivo que sea del tipo Google Drive (Google Doc, Google Sheet, etc.) tendrá el atributo webViewLink . Un webViewLink abrirá el archivo en Google Drive.

  • Un archivo que no sea de Google Drive tendrá webContentLink . Un webContentLink descargará el archivo.

Mi código:

var request = gapi.client.drive.files.list({ q:"''0Bz9_vPIAWUcSWWo0UHptQ005cnM'' in parents", //folder ID ''fields'': "files(id, name, webContentLink, webViewLink)" }); request.execute(function(resp) { console.log(resp); }


Basado en esta documentación , si está usando alt=media , debe realizar una solicitud HTTP GET autorizada a la resource URL del archivo e incluir el parámetro de consulta alt=media .

GET https://www.googleapis.com/drive/v3/files/0B9jNhSvVjoIVM3dKcGRKRmVIOVU?alt=media Authorization: Bearer ya29.AHESVbXTUv5mHMo3RYfmS1YJonjzzdTOFZwvyOAUVhrs

Consulte aquí los ejemplos de realizar una descarga de archivos con nuestras bibliotecas de clientes de Drive API.

String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M"; OutputStream outputStream = new ByteArrayOutputStream(); driveService.files().get(fileId) .executeMediaAndDownloadTo(outputStream);

Para el error (403) Permiso insuficiente , tal vez este sea un problema con su token de acceso, no con la configuración de su proyecto.

El error de permisos insuficientes se devuelve cuando no ha solicitado los ámbitos que necesita cuando recuperó su token de acceso. Puede verificar qué ámbitos ha solicitado al pasar su access_token a este punto final: https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ACCESS_TOKEN

Verifique estos enlaces:


Descubrí que puedo recuperar URLs de todos esos archivos de la carpeta usando archivos ''
webViewLink o webViewContent . Un archivo que sea de tipo Google Drive (Google Doc, Google Sheet, etc.) tendrá el atributo webViewLink y un archivo que no sea de Google Drive tendrá webContentLink . El webViewLink abrirá el archivo en Google Drive y el webContentLink descargará el archivo. Mi código:

var request = gapi.client.drive.files.list({ q:"''0Bz9_vPIAWUcSWWo0UHptQ005cnM'' in parents", //folder ID fields: "files(id, name, webContentLink, webViewLink)" }); request.execute(function(resp) { console.log(resp); //access to files in this variable }


Phu, estabas tan cerca!

Gracias por compartir su método de uso de webContentLink y webViewLink. Creo que es mejor para la mayoría de los propósitos. Pero en mi aplicación, no pude usar viewContentLink porque necesito poder ingresar la imagen en un lienzo, y la imagen que proporciona google no está lista para CORS.

Entonces aquí hay un método

var fileId = ''<your file id>''; var accessToken = gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse().access_token;// or this: gapi.auth.getToken().access_token; var xhr = new XMLHttpRequest(); xhr.open("GET", "https://www.googleapis.com/drive/v3/files/"+fileId+''?alt=media'', true); xhr.setRequestHeader(''Authorization'',''Bearer ''+accessToken); xhr.responseType = ''arraybuffer'' xhr.onload = function(){ //base64ArrayBuffer from https://gist.github.com/jonleighton/958841 var base64 = ''data:image/png;base64,'' + base64ArrayBuffer(xhr.response); //do something with the base64 image here } xhr.send();

Observe que configuré el tipo de respuesta a arraybuffer y moví alt=media a la llamada xhr.open . También agarré una función que convierte el buffer de la matriz a base64 de https://gist.github.com/jonleighton/958841 .