Saltar al contenido
Lacodigoteca.com

Subir documentos a Google Drive con PHP

Subir documentos a Google Drive con PHP

En ocasiones necesitamos usar servicios para alojar tus archivos o documentos en línea en la nube. Existen muchos servicios que ofrecen como Google Drive o Dropbox. Estos servicios ofrecen su API para web (o para otros entornos y lenguajes de programación). El que servicio que vamos a utilizar es es Google Drive, que pertenece a Google y es uno de los mejores servicios junto a otros para crear, eliminar, exportar, listar, etc. archivos en su plataforma.

¿Qúe es una API?

Una API es un conjunto de definiciones y protocolos que se utilizan para desarrollar e integrar el software de las aplicaciones. API significa interfaz de programación de aplicaciones.

Las API permiten que sus productos y servicios se comuniquen con otros, sin necesidad de saber cómo están implementados. Esto simplifica el desarrollo de las aplicaciones y permite ahorrar tiempo y dinero. Las API le otorgan flexibilidad; simplifican el diseño, la administración y el uso de las aplicaciones, y proporcionan oportunidades de innovación, lo cual es ideal al momento de diseñar herramientas y productos nuevos (o de gestionar los actuales).

Si queréis más información os dejo el siguiente enlace.

¿Qué APIS tiene Google?

Pues tienen API de cualquier producto de Google. Los más demandados son de Google Cloud, Google Maps, Android, Google Analytics, etc.

En este POST, vamos a ver el proceso de subir documentos a Google Drive con PHP utilizando la API de Google, por lo que vamos a mostrar cómo hacerlo paso a paso.

Explicación paso a paso

Configuración del servicio

Vamos a la web de Google API Console y pulsamos a “Nuevo Proyecto”

Subir documentos a Google Drive con PHP 2

En el buscador, buscamos la API “Google Drive API” y la habilitamos.

Subir documentos a Google Drive con PHP 4
Subir documentos a Google Drive con PHP 6

En el menú que se encuentra a la izquierda de Google Drive API, pulsamos a Credenciales.

Subir documentos a Google Drive con PHP 8

Pulsamos a Crear credenciales y nos saldrá un desplegable, por lo que tenemos que seleccionar “Cuenta de servicio”.

Subir documentos a Google Drive con PHP 10

Rellenamos los datos del formulario, introducimos los datos para nuestra API:

Nombre de cuenta de servicio: lacodigoteca
ID de cuenta de servicio: lacodigoteca
Descripción de la cuenta de servicio: La codigoteca

Subir documentos a Google Drive con PHP 12

Ahora vamos a asignar permisos en la cuenta de la API. En este caso, vamos a darle permisos de Propietario.

Subir documentos a Google Drive con PHP 14

Pulsamos al correo electrónico que nos ha creado el servicio, y pulsamos añadir clave.

Subir documentos a Google Drive con PHP 16
Subir documentos a Google Drive con PHP 18

Al pulsar a añadir Clave, nos va a preguntar cómo queremos nuestra clave privada, en formato JSON o en P12. Vamos a seleccionar a JSON.

Subir documentos a Google Drive con PHP 20

Nos va descargar un fichero JSON en nuestro ordenador, en el que vamos a utilizar después.

Subir documentos a Google Drive con PHP 22

Permisos en nuestro Google Drive

Nos dirigimos a nuestro Google Drive y creamos una carpeta, en mi caso se llamará “lacodigoteca”. Accedemos dentro de la carpeta y pulsamos a “Compartir”

Subir documentos a Google Drive con PHP 24

Añadimos el correo del servicio y le damos permisos de Editor.

Subir documentos a Google Drive con PHP 26

Restringiremos el acceso a la carpeta y copiaremos el enlace a compartir.

Subir documentos a Google Drive con PHP 28

En el enlace a compartir podemos ver cuál es el ID, os dejo un enlace de ejemplo con el ID en negrita.

https://drive.google.com/drive/folders/1qKTBAOXqB3d90OSubbp6Nvh10CQdFpXb?usp=sharing

Instalación de la librería Google API para PHP.

Nos dirigimos al repositorio de la librería Google API para PHP https://github.com/googleapis/google-api-php-client/releases

Subir documentos a Google Drive con PHP 30

Descargamos la última versión y descargamos el fichero ZIP con la versión de PHP que estamos utilizando en nuestro proyecto web. Con ello extraemos la carpeta y la dejamos en el directorio raíz de nuestro proyecto.

Archivo PHP (paso a paso)

Añadimos el archivo de la API a nuestro fichero .php


<?
include_once 'google-api-php-client-v2.7.2-PHP7.4/vendor/autoload.php';

Creamos una función en el que nos servirá para subir documentos a Google Drive:

En la variable $claveJSON indicaremos cual es la ID de la carpeta de Google Drive que hemos creado anteriormente.

En la variable $pathJSON , tenemos que poner el nombre del fichero JSON, que es el que tiene la clave para utilizar el servicio. El fichero JSON lo tengo alojado en la raíz del proyecto.


function subirDocumentoDrive($documento,$descripcion){
	// Variables de credenciales.
	$claveJSON = '1qKTBAOXqB3d90OSubbp6Nvh10CQdFpXb';
	$pathJSON = 'lacodigoteca-87cea347411f.json';
	
	//configurar variable de entorno
	putenv('GOOGLE_APPLICATION_CREDENTIALS='.$pathJSON);

	$client = new Google_Client();
	$client->useApplicationDefaultCredentials();
	$client->setScopes(['https://www.googleapis.com/auth/drive.file']);
	try{		
		//instanciamos el servicio
		$service = new Google_Service_Drive($client);

		//instacia de archivo
		$file = new Google_Service_Drive_DriveFile();
		$file->setName($documento);

		//obtenemos el mime type
		$finfo = finfo_open(FILEINFO_MIME_TYPE); 
		$mime_type=finfo_file($finfo, $documento);

		//id de la carpeta donde hemos dado el permiso a la cuenta de servicio 
		$file->setParents(array($claveJSON));
		$file->setDescription($descripcion);
		$file->setMimeType($mime_type);
		$result = $service->files->create(
		  $file,
		  array(
			'data' => file_get_contents($documento),
			'mimeType' => $mime_type,
			'uploadType' => 'media',
		  )
		);
		echo "2.- Fichero subido a Google Drive. 
"; }catch(Google_Service_Exception $gs){ $m=json_decode($gs->getMessage()); echo $m->error->message; }catch(Exception $e){ echo $e->getMessage(); } }

Diseñamos nuestro formulario HTML


<html>
	<head>
		<title>Subir ficheros a Google drive.</title>
	</head>
	<body>
		<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" enctype="multipart/form-data">
			<label for="documento">Documento:</label>
			<input type="file" name="documento" required /><br>
			<label for="descripcion">Descripción:</label>
			<input type="text" name="descripcion" required /><br>
			<input type="submit" name="enviar" value="Subir documento a Google Drive" />
		</form>
	</body>
</html>

Procedemos a subir nuestro fichero a nuestro servidor de manera temporal, ya que una vez subido a Google Drive, vamos a eliminarlo.

if($_SERVER["REQUEST_METHOD"] == "POST"){
	$documento = htmlspecialchars($_FILES['documento']['name']);
	$descripcion = htmlspecialchars($_POST['descripcion']);
	
	// Subimos el documento a nuestro servidor.
	if(move_uploaded_file($_FILES['documento']['tmp_name'], $documento)){
		echo "1.- Fichero subido al servidor. 
"; subirDocumentoDrive($documento,$descripcion); if (unlink($documento)){ echo "3.- Fichero eliminado del servidor"; }else{ echo 'Error: No se ha podido eliminar el documento "'.$documento.'" en el servidor.'; } }else{ echo "Error: Se ha producido un error, intentelo de nuevo."; } }

Archivo PHP (completo)


<?php
include_once 'google-api-php-client-v2.7.2-PHP7.4/vendor/autoload.php';

function subirDocumentoDrive($documento,$descripcion){
	// Variables de credenciales.
	$claveJSON = '1qKTBAOXqB3d90OSubbp6Nvh10CQdFpXb';
	$pathJSON = 'lacodigoteca-87cea347411f.json';

	//configurar variable de entorno
	putenv('GOOGLE_APPLICATION_CREDENTIALS='.$pathJSON);

	$client = new Google_Client();
	$client->useApplicationDefaultCredentials();
	$client->setScopes(['https://www.googleapis.com/auth/drive.file']);
	try{		
		//instanciamos el servicio
		$service = new Google_Service_Drive($client);

		//instacia de archivo
		$file = new Google_Service_Drive_DriveFile();
		$file->setName($documento);

		//obtenemos el mime type
		$finfo = finfo_open(FILEINFO_MIME_TYPE); 
		$mime_type=finfo_file($finfo, $documento);

		//id de la carpeta donde hemos dado el permiso a la cuenta de servicio 
		$file->setParents(array($claveJSON));
		$file->setDescription($descripcion);
		$file->setMimeType($mime_type);

		$result = $service->files->create(
		  $file,
		  array(
			'data' => file_get_contents($documento),
			'mimeType' => $mime_type,
			'uploadType' => 'media',
		  )
		);
		/* FICHERO SUBIDO A GOOGLE DRIVE */
		echo "2.- Fichero subido a Google Drive. 
"; }catch(Google_Service_Exception $gs){ $m=json_decode($gs->getMessage()); echo $m->error->message; }catch(Exception $e){ echo $e->getMessage(); } } if($_SERVER["REQUEST_METHOD"] == "POST"){ $documento = htmlspecialchars($_FILES['documento']['name']); $descripcion = htmlspecialchars($_POST['descripcion']); // Subimos el documento a nuestro servidor. if(move_uploaded_file($_FILES['documento']['tmp_name'], $documento)){ echo "1.- Fichero subido al servidor.
"; subirDocumentoDrive($documento,$descripcion); if (unlink($documento)){ echo "3.- Fichero eliminado del servidor"; }else{ echo 'Error: No se ha podido eliminar el documento "'.$documento.'" en el servidor.'; } }else{ echo "Error: Se ha producido un error, intentelo de nuevo."; } } ?> <html> <head> <title>Subir ficheros a Google drive.</title> </head> <body> <form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" enctype="multipart/form-data"> <label for="documento">Documento:</label> <input type="file" name="documento" required /><br> <label for="descripcion">Descripción:</label> <input type="text" name="descripcion" required /><br> <input type="submit" name="enviar" value="Subir documento a Google Drive" /> </form> </body> </html>

Nota: Si queréis subir varios documentos a Google Drive con PHP a la vez, os recomiendo que echéis un vistazo al siguiente post:

Configuración
A %d blogueros les gusta esto: