Integrar con el menú contextual "Abrir con" de la IU de Drive

Cuando un usuario selecciona un archivo y hace clic en la opción "Abrir con" de la IU de Drive elemento de menú, redireccionamientos de Drive al usuario a la URL abierta de esa app que se define en la sección Cómo configurar una IU de Drive con una integración continua.

Si marcaste el botón "Importación" cuando configuraste una IU de Drive de la aplicación, el usuario puede seleccionar una combinación Archivos de Google Workspace para abrir. Cuando configuras una IU de Drive , los archivos específicos de la app se definen en la sección "Tipos de MIME predeterminados" y "Extensiones de archivo predeterminadas" mientras que Google Workspace los archivos se definen en la sección "Tipos de MIME secundarios" y "Extensiones de archivo secundarias" .

Para cada archivo que el usuario quiere abrir, Drive verifica el MIME. tipos en función de los tipos de MIME predeterminados y secundarios definidos:

  • Para los tipos de MIME definidos en la sección "Tipos de MIME predeterminados" , el ID del archivo es pasan a tu app. Para obtener información sobre cómo manejar archivos específicos de la aplicación, Consulta Maneja una URL abierta para documentos específicos de la app.

  • Para los tipos de MIME definidos en la sección "Tipos de MIME secundarios" La IU de Drive muestra un diálogo en el que se le pregunta al usuario qué tipo de archivo convertir el archivo de Google Workspace. Por ejemplo, si seleccionas un Archivo de Documentos de Google en la IU de Drive y el “MIME secundario tipos" sugiere que tu app admite texto/sin formato o aplicación/pdf, el La IU de Drive le pregunta al usuario si quiere convertir a texto sin formato o PDF.

    Si necesitas información para administrar Google Workspace, consulta Administra una URL abierta en documentos de Google Workspace. Para obtener una lista de documentos de Google Workspace y formatos de conversión de tipos de MIME, consulta Exporta tipos de MIME para Google Workspace documentos.

Controla una URL abierta para documentos específicos de la app

Como se mencionó en Configura una IU de Drive integración, tu app recibe variables de plantilla con información para que la abra. el archivo. Tu app recibe un conjunto predeterminado de variables de plantilla dentro de un parámetro state. El La información predeterminada de state para una URL abierta específica de una app es la siguiente:

{
  "ids": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

En esta salida, se incluyen los siguientes valores:

  • ID: Es el ID de la carpeta superior.
  • RESOURCE_KEYS: Un diccionario JSON de los IDs de archivo asignados a sus respectivas claves de recursos.
  • open: Es la acción que se realiza. El valor es open cuando se usa un URL.
  • USER_ID: Es el ID de perfil que identifica de forma inequívoca al usuario.

Tu app debe tomar medidas respecto de esta solicitud; para ello, sigue estos pasos:

  1. Verifica que el campo action tenga el valor open y que el campo ids esté configurado presente.
  2. Usa el valor userId para crear una sesión nueva para el usuario. Para ver más información sobre los usuarios que iniciaron sesión, consulta Usuarios y nuevos eventos.
  3. Usa el método files.get para verificarlo. permisos, recuperar metadatos de archivos y descargar el contenido del archivo usando los valores de ID.
  4. Si se configuró resourceKeys en la solicitud, establece el Encabezado de la solicitud X-Goog-Drive-Resource-Keys. Para obtener más información claves de recursos, consulta Cómo acceder a archivos compartidos por vínculos con claves.

El parámetro state está codificado en formato URL, por lo que tu app debe controlar el escape caracteres y analizarlos como JSON.

Controla una URL abierta para documentos de Google Workspace

Como se mencionó en Configura una IU de Drive integrada, la app recibe un conjunto predeterminado de variables de plantilla dentro de un parámetro state. La información predeterminada de state para una URL abierta de Google Workspace es:

{
  "exportIds": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

En esta salida, se incluyen los siguientes valores:

  • EXPORT_ID: Una lista separada por comas de los IDs de archivo que se exportado (solo se usa al abrir los documentos integrados de Google).
  • RESOURCE_KEYS: Un diccionario JSON de los IDs de archivo asignados a sus respectivas claves de recursos.
  • open: Es la acción que se realiza. El valor es open cuando se usa un URL.
  • USER_ID: Es el ID de perfil que identifica al usuario.

Tu app debe tomar medidas respecto de esta solicitud; para ello, sigue estos pasos:

  1. Detecta los open a fin de verificar que se trate de una solicitud para abrir un archivo. El valor en el campo state y la presencia del campo exportIds.

  2. Usa el método files.get para verificarlo. buscar metadatos de archivos y determinar el tipo de MIME mediante el EXPORT_ID.

  3. Convierte el contenido del archivo con el files.export. Lo siguiente de código de ejemplo muestra cómo exportar un documento de Google Workspace al el tipo de MIME solicitado.

  4. Si se configuró resourceKey en la solicitud, establece el Encabezado de la solicitud X-Goog-Drive-Resource-Keys. Para obtener más información claves de recursos, consulta Cómo acceder a archivos compartidos por vínculos con claves.

    Java

    drive/snippets/drive_v3/src/main/java/ExportPdf.java
    import com.google.api.client.googleapis.json.GoogleJsonResponseException;
    import com.google.api.client.http.HttpRequestInitializer;
    import com.google.api.client.http.javanet.NetHttpTransport;
    import com.google.api.client.json.gson.GsonFactory;
    import com.google.api.services.drive.Drive;
    import com.google.api.services.drive.DriveScopes;
    import com.google.auth.http.HttpCredentialsAdapter;
    import com.google.auth.oauth2.GoogleCredentials;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Arrays;
    
    /* Class to demonstrate use-case of drive's export pdf. */
    public class ExportPdf {
    
      /**
       * Download a Document file in PDF format.
       *
       * @param realFileId file ID of any workspace document format file.
       * @return byte array stream if successful, {@code null} otherwise.
       * @throws IOException if service account credentials file not found.
       */
      public static ByteArrayOutputStream exportPdf(String realFileId) throws IOException {
        // Load pre-authorized user credentials from the environment.
        // TODO(developer) - See https://developers.google.com/identity for
        // guides on implementing OAuth2 for your application.
        GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
            .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
        HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
            credentials);
    
        // Build a new authorized API client service.
        Drive service = new Drive.Builder(new NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            requestInitializer)
            .setApplicationName("Drive samples")
            .build();
    
        OutputStream outputStream = new ByteArrayOutputStream();
        try {
          service.files().export(realFileId, "application/pdf")
              .executeMediaAndDownloadTo(outputStream);
    
          return (ByteArrayOutputStream) outputStream;
        } catch (GoogleJsonResponseException e) {
          // TODO(developer) - handle error appropriately
          System.err.println("Unable to export file: " + e.getDetails());
          throw e;
        }
      }
    }

    Python

    drive/snippets/drive-v3/file_snippet/export_pdf.py
    import io
    
    import google.auth
    from googleapiclient.discovery import build
    from googleapiclient.errors import HttpError
    from googleapiclient.http import MediaIoBaseDownload
    
    
    def export_pdf(real_file_id):
      """Download a Document file in PDF format.
      Args:
          real_file_id : file ID of any workspace document format file
      Returns : IO object with location
    
      Load pre-authorized user credentials from the environment.
      TODO(developer) - See https://developers.google.com/identity
      for guides on implementing OAuth2 for the application.
      """
      creds, _ = google.auth.default()
    
      try:
        # create drive api client
        service = build("drive", "v3", credentials=creds)
    
        file_id = real_file_id
    
        # pylint: disable=maybe-no-member
        request = service.files().export_media(
            fileId=file_id, mimeType="application/pdf"
        )
        file = io.BytesIO()
        downloader = MediaIoBaseDownload(file, request)
        done = False
        while done is False:
          status, done = downloader.next_chunk()
          print(f"Download {int(status.progress() * 100)}.")
    
      except HttpError as error:
        print(f"An error occurred: {error}")
        file = None
    
      return file.getvalue()
    
    
    if __name__ == "__main__":
      export_pdf(real_file_id="1zbp8wAyuImX91Jt9mI-CAX_1TqkBLDEDcr2WeXBbKUY")

    Node.js

    drive/snippets/drive_v3/file_snippets/export_pdf.js
    /**
     * Download a Document file in PDF format
     * @param{string} fileId file ID
     * @return{obj} file status
     * */
    async function exportPdf(fileId) {
      const {GoogleAuth} = require('google-auth-library');
      const {google} = require('googleapis');
    
      // Get credentials and build service
      // TODO (developer) - Use appropriate auth mechanism for your app
      const auth = new GoogleAuth({
        scopes: 'https://www.googleapis.com/auth/drive',
      });
      const service = google.drive({version: 'v3', auth});
    
      try {
        const result = await service.files.export({
          fileId: fileId,
          mimeType: 'application/pdf',
        });
        console.log(result.status);
        return result;
      } catch (err) {
        // TODO(developer) - Handle error
        throw err;
      }
    }

    PHP

    drive/snippets/drive_v3/src/DriveExportPdf.php
    use Google\Client;
    use Google\Service\Drive;
    function exportPdf()
    {
        try {
            $client = new Client();
            $client->useApplicationDefaultCredentials();
            $client->addScope(Drive::DRIVE);
            $driveService = new Drive($client);
            $realFileId = readline("Enter File Id: ");
            $fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
            $fileId = $realFileId;
            $response = $driveService->files->export($fileId, 'application/pdf', array(
                'alt' => 'media'));
            $content = $response->getBody()->getContents();
            return $content;
    
        }  catch(Exception $e) {
             echo "Error Message: ".$e;
        }
    
    }

Mostrar los archivos convertidos como de solo lectura o presentar un diálogo que permita al usuario guarda el archivo como el tipo de archivo nuevo.

El parámetro state está codificado en formato URL, por lo que tu app debe controlar el escape caracteres y analizarlos como JSON.

Usuarios y nuevos eventos

Las apps de Drive deben tratar todo lo que se abre con eventos como posibles y accesos. Es posible que algunos usuarios tengan varias cuentas, por lo que el ID de usuario de state no coincida con la sesión actual. Si el ID de usuario de state no coincide con la sesión actual, finaliza la sesión actual de tu y acceder como el usuario solicitado.

Además de abrir una aplicación desde la IU de Google Drive, las aplicaciones pueden Muestra un selector de archivos para seleccionar contenido dentro de una app. Para ver más consulta el Selector de Google.