Fazer o download e exportar arquivos

A API Google Drive é compatível com vários tipos de ações de download e exportação, conforme listado na tabela a seguir:

Ações de download
Conteúdo do arquivo blob usando o método files.get com o parâmetro de URL alt=media.
Conteúdo do arquivo blob em uma versão anterior usando o método revisions.get com o parâmetro de URL alt=media.
Conteúdo do arquivo blob em um navegador usando o campo webContentLink.
Conteúdo do arquivo blob usando o método files.download durante operações de longa duração. Essa é a única maneira de baixar arquivos do Google Vids.
Ações de exportação
Conteúdo de documentos do Google Workspace em um formato que seu app possa processar usando o método files.export.
Conteúdo de documentos do Google Workspace em um navegador usando o campo exportLinks.
Conteúdo de documentos do Google Workspace em uma versão anterior em um navegador usando o campo exportLinks.
Conteúdo de documentos do Google Workspace usando o método files.download durante operações de longa duração.

Antes de fazer o download ou exportar o conteúdo do arquivo, verifique se os usuários podem baixar o arquivo usando o campo capabilities.canDownload no recurso files.

Para descrições dos tipos de arquivo mencionados aqui, incluindo blob e arquivos do Google Workspace, consulte Tipos de arquivo.

O restante deste guia fornece instruções detalhadas para realizar esses tipos de ações de download e exportação.

Baixar conteúdo de arquivo blob

Para fazer o download de um arquivo blob armazenado no Drive, use o método files.get com o ID do arquivo a ser baixado e o parâmetro de URL alt=media. O parâmetro de URL alt=media informa ao servidor que um download de conteúdo está sendo solicitado como um formato de resposta alternativo.

O parâmetro de URL alt=media é um parâmetro de sistema disponível em todas as APIs REST do Google. Se você usa uma biblioteca de cliente para a API Drive, não precisa definir esse parâmetro explicitamente.

O exemplo de código a seguir mostra como usar o método files.get para baixar um arquivo com as bibliotecas de cliente da API Drive.

Java

drive/snippets/drive_v3/src/main/java/DownloadFile.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 download file. */
public class DownloadFile {

  /**
   * 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 downloadFile(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();

    try {
      OutputStream outputStream = new ByteArrayOutputStream();

      service.files().get(realFileId)
          .executeMediaAndDownloadTo(outputStream);

      return (ByteArrayOutputStream) outputStream;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to move file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/download_file.py
import io

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaIoBaseDownload


def download_file(real_file_id):
  """Downloads a file
  Args:
      real_file_id: ID of the file to download
  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().get_media(fileId=file_id)
    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__":
  download_file(real_file_id="1KuPmvGq8yoYgbfW74OENMCB5H0n_2Jm9")

Node.js

drive/snippets/drive_v3/file_snippets/download_file.js
/**
 * Downloads a file
 * @param{string} realFileId file ID
 * @return{obj} file status
 * */
async function downloadFile(realFileId) {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});

  fileId = realFileId;
  try {
    const file = await service.files.get({
      fileId: fileId,
      alt: 'media',
    });
    console.log(file.status);
    return file.status;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveDownloadFile.php
use Google\Client;
use Google\Service\Drive;
function downloadFile()
 {
    try {

      $client = new Client();
      $client->useApplicationDefaultCredentials();
      $client->addScope(Drive::DRIVE);
      $driveService = new Drive($client);
      $realFileId = readline("Enter File Id: ");
      $fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
      $fileId = $realFileId;
      $response = $driveService->files->get($fileId, array(
          'alt' => 'media'));
      $content = $response->getBody()->getContents();
      return $content;

    } catch(Exception $e) {
      echo "Error Message: ".$e;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/DownloadFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of drive's download file.
    public class DownloadFile
    {
        /// <summary>
        /// Download a Document file in PDF format.
        /// </summary>
        /// <param name="fileId">file ID of any workspace document format file.</param>
        /// <returns>byte array stream if successful, null otherwise.</returns>
        public static MemoryStream DriveDownloadFile(string fileId)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for 
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential
                    .GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var request = service.Files.Get(fileId);
                var stream = new MemoryStream();

                // Add a handler which will be notified on progress changes.
                // It will notify on each chunk download and when the
                // download is completed or failed.
                request.MediaDownloader.ProgressChanged +=
                    progress =>
                    {
                        switch (progress.Status)
                        {
                            case DownloadStatus.Downloading:
                            {
                                Console.WriteLine(progress.BytesDownloaded);
                                break;
                            }
                            case DownloadStatus.Completed:
                            {
                                Console.WriteLine("Download complete.");
                                break;
                            }
                            case DownloadStatus.Failed:
                            {
                                Console.WriteLine("Download failed.");
                                break;
                            }
                        }
                    };
                request.Download(stream);

                return stream;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Este exemplo de código usa um método de biblioteca que adiciona o parâmetro de URL alt=media à solicitação HTTP subjacente.

Os downloads de arquivos iniciados no seu app precisam ser autorizados com um escopo que permita acesso de leitura ao conteúdo do arquivo. Por exemplo, um app que usa o escopo drive.readonly.metadata não tem autorização para fazer o download do conteúdo do arquivo. Este exemplo de código usa o escopo de arquivo "drive" restrito, que permite aos usuários ver e gerenciar todos os arquivos do Drive. Para saber mais sobre escopos do Drive, consulte Escolher escopos da API Google Drive.

Os usuários com permissões owner (para arquivos do Meu Drive) ou organizer (para arquivos de drive compartilhado) podem restringir o download usando o objeto DownloadRestrictionsMetadata. Para mais informações, consulte Impedir que os usuários baixem, imprimam ou copiem seu arquivo.

Os arquivos identificados como abusivos (como software malicioso) só podem ser baixados pelo proprietário. Além disso, o parâmetro de consulta get acknowledgeAbuse=true precisa ser incluído para indicar que o usuário reconheceu o risco de fazer o download de software potencialmente indesejado ou outros arquivos abusivos. Seu aplicativo precisa avisar o usuário de forma interativa antes de usar esse parâmetro de consulta.

Download parcial

O download parcial envolve o download apenas de uma parte especificada de um arquivo. É possível especificar a parte do arquivo que você quer baixar usando um intervalo de bytes com o cabeçalho Range. Exemplo:

Range: bytes=500-999

Baixar o conteúdo do arquivo blob em uma versão anterior

Só é possível baixar revisões de conteúdo de arquivos blob marcadas como "Manter indefinidamente". Se quiser baixar uma revisão, defina como "Manter indefinidamente" primeiro. Para mais informações, consulte Especificar revisões para salvar da exclusão automática.

Para fazer o download do conteúdo de arquivos blob em uma versão anterior, use o método revisions.get com o ID do arquivo a ser baixado, o ID da revisão e o parâmetro de URL alt=media. O parâmetro de URL alt=media informa ao servidor que um download de conteúdo está sendo solicitado como um formato de resposta alternativo. Assim como files.get, o método revisions.get também aceita o parâmetro de consulta opcional acknowledgeAbuse e o cabeçalho Range. Para mais informações, consulte Gerenciar operações de longa duração.

O protocolo de solicitação é mostrado aqui.

GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=media

Fazer o download do conteúdo de um arquivo blob em um navegador

Para baixar o conteúdo de arquivos blob armazenados no Drive em um navegador, em vez de usar a API, use o campo webContentLink do recurso files. Se o usuário tiver acesso para fazer o download do arquivo, um link para baixar o arquivo e o conteúdo dele será retornado. É possível redirecionar um usuário para esse URL ou oferecê-lo como um link clicável.

Fazer o download do conteúdo do arquivo blob durante operações de longa duração

Para fazer o download do conteúdo de arquivos blob durante operações de longa duração, use o método files.download com o ID do arquivo a ser baixado. Também é possível definir o ID da revisão. Essa é a única maneira de fazer o download de arquivos do Google Vids. Para mais informações, consulte Gerenciar operações de longa duração.

Exportar conteúdo de documentos do Google Workspace

Para exportar o conteúdo de bytes de um documento do Google Workspace, use o método files.export com o ID do arquivo a ser exportado e o tipo MIME correto. O conteúdo exportado é limitado a 10 MB.

O exemplo de código a seguir mostra como usar o método files.export para exportar um documento do Google Workspace em formato PDF usando as bibliotecas de cliente da API Drive:

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;
    }

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/ExportPdf.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive export pdf
    public class ExportPdf
    {
        /// <summary>
        /// Download a Document file in PDF format.
        /// </summary>
        /// <param name="fileId">Id of the file.</param>
        /// <returns>Byte array stream if successful, null otherwise</returns>
        public static MemoryStream DriveExportPdf(string fileId)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for 
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var request = service.Files.Export(fileId, "application/pdf");
                var stream = new MemoryStream();
                // Add a handler which will be notified on progress changes.
                // It will notify on each chunk download and when the
                // download is completed or failed.
                request.MediaDownloader.ProgressChanged +=
                    progress =>
                    {
                        switch (progress.Status)
                        {
                            case DownloadStatus.Downloading:
                            {
                                Console.WriteLine(progress.BytesDownloaded);
                                break;
                            }
                            case DownloadStatus.Completed:
                            {
                                Console.WriteLine("Download complete.");
                                break;
                            }
                            case DownloadStatus.Failed:
                            {
                                Console.WriteLine("Download failed.");
                                break;
                            }
                        }
                    };
                request.Download(stream);
                return stream;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Este exemplo de código usa o escopo restrito drive, que permite aos usuários visualizar e gerenciar todos os arquivos do Drive. Para saber mais sobre escopos do Drive, consulte Escolher escopos da API Google Drive.

O exemplo de código também declara o tipo MIME de exportação como application/pdf. Para uma lista completa de todos os tipos MIME de exportação compatíveis com cada documento do Google Workspace, consulte Tipos MIME de exportação para documentos do Google Workspace.

Exportar conteúdo de documentos do Google Workspace em um navegador

Para exportar o conteúdo de um documento do Google Workspace em um navegador, use o campo exportLinks do recurso files. Dependendo do tipo de documento, um link para baixar o arquivo e o conteúdo dele é retornado para cada tipo MIME disponível. É possível redirecionar um usuário para um URL ou oferecê-lo como um link clicável.

Exportar conteúdo de documentos do Google Workspace em uma versão anterior em um navegador

Para exportar o conteúdo de um documento do Google Workspace em uma versão anterior em um navegador, use o método revisions.get com o ID do arquivo a ser baixado e o ID da revisão para gerar um link de exportação em que você pode fazer o download. Se o usuário tiver acesso para baixar o arquivo, um link para fazer isso e acessar o conteúdo dele será retornado. É possível redirecionar um usuário para esse URL ou oferecê-lo como um link clicável.

Exportar conteúdo de documentos do Google Workspace durante operações de longa duração

Para exportar o conteúdo de documentos do Google Workspace durante operações de longa duração, use o método files.download com o ID do arquivo a ser baixado e o ID da revisão. Para mais informações, consulte Gerenciar operações de longa duração.

Limitar o compartilhamento de arquivos