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
. UnwebViewLink
abrirá el archivo en Google Drive.Un archivo que no sea de Google Drive tendrá
webContentLink
. UnwebContentLink
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:
- google plus api: error "insuficientesPermisiones"
La unidad de Google sube la carga - (403) Permiso insuficiente
Recuerde que está cargando a la cuenta de las cuentas de servicio de Google Drive. Si desea poder verlo desde su propia cuenta de unidad de Google, tendrá que hacer una inserción de los permisos. para darte acceso
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 .