Télécharger et exporter des fichiers

L'API Google Drive accepte plusieurs types d'actions de téléchargement et d'exportation, comme indiqué dans le tableau suivant :

Actions de téléchargement
Contenu du fichier blob à l'aide de la méthode files.get avec le paramètre d'URL alt=media.
Contenu du fichier blob dans une version antérieure à l'aide de la méthode revisions.get avec le paramètre d'URL alt=media.
Contenu du fichier Blob dans un navigateur à l'aide du champ webContentLink.
Contenu du fichier blob à l'aide de la méthode files.download lors d'opérations de longue durée. Il s'agit du seul moyen de télécharger des fichiers Google Vids.
Actions d'exportation
Contenu de document Google Workspace dans un format que votre application peut gérer, à l'aide de la méthode files.export.
Contenu d'un document Google Workspace dans un navigateur à l'aide du champ exportLinks.
le contenu d'un document Google Workspace à une version antérieure dans un navigateur à l'aide du champ exportLinks.
Contenu de document Google Workspace à l'aide de la méthode files.download lors d'opérations de longue durée.

Avant de télécharger ou d'exporter le contenu d'un fichier, vérifiez que les utilisateurs peuvent le télécharger à l'aide du champ capabilities.canDownload de la ressource files.

Pour obtenir des descriptions des types de fichiers mentionnés ici, y compris les fichiers blob et Google Workspace, consultez Types de fichiers.

Le reste de ce guide fournit des instructions détaillées pour effectuer ces types d'actions de téléchargement et d'exportation.

Télécharger le contenu d'un fichier blob

Pour télécharger un fichier blob stocké sur Drive, utilisez la méthode files.get avec l'ID du fichier à télécharger et le paramètre d'URL alt=media. Le paramètre d'URL alt=media indique au serveur qu'un téléchargement de contenu est demandé comme format de réponse alternatif.

Le paramètre d'URL alt=media est un paramètre système disponible dans toutes les API REST Google. Si vous utilisez une bibliothèque cliente pour l'API Drive, vous n'avez pas besoin de définir explicitement ce paramètre.

L'exemple de code suivant montre comment utiliser la méthode files.get pour télécharger un fichier avec les bibliothèques clientes de l'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
<?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;
        }
    }
}

Cet exemple de code utilise une méthode de bibliothèque qui ajoute le paramètre d'URL alt=media à la requête HTTP sous-jacente.

Les téléchargements de fichiers lancés depuis votre application doivent être autorisés avec un champ d'application qui permet l'accès en lecture au contenu du fichier. Par exemple, une application utilisant le champ d'application drive.readonly.metadata n'est pas autorisée à télécharger le contenu des fichiers. Cet exemple de code utilise le champ d'application restreint "drive" qui permet aux utilisateurs d'afficher et de gérer tous vos fichiers Drive. Pour en savoir plus sur les habilitations Drive, consultez Choisir les habilitations de l'API Google Drive.

Les utilisateurs disposant des autorisations owner (pour les fichiers Mon Drive) ou organizer (pour les fichiers Drive partagé) peuvent limiter le téléchargement via l'objet DownloadRestrictionsMetadata. Pour en savoir plus, consultez Empêcher les autres utilisateurs de télécharger, d'imprimer ou de copier votre fichier.

Les fichiers identifiés comme abusifs (logiciels malveillants, par exemple) ne peuvent être téléchargés que par leur propriétaire. De plus, le paramètre de requête get acknowledgeAbuse=true doit être inclus pour indiquer que l'utilisateur a pris connaissance des risques liés au téléchargement de logiciels potentiellement indésirables ou d'autres fichiers abusifs. Votre application doit avertir l'utilisateur de manière interactive avant d'utiliser ce paramètre de requête.

Téléchargement partiel

Le téléchargement partiel consiste à télécharger uniquement une partie spécifiée d'un fichier. Vous pouvez spécifier la partie du fichier que vous souhaitez télécharger en utilisant une plage d'octets avec l'en-tête Range. Exemple :

Range: bytes=500-999

Télécharger le contenu d'un fichier blob dans une version antérieure

Vous ne pouvez télécharger que les révisions de contenu de fichiers blob marquées comme "Conserver indéfiniment". Si vous souhaitez télécharger une révision, définissez-la d'abord sur "Conserver indéfiniment". Pour en savoir plus, consultez Spécifier les révisions à enregistrer pour éviter la suppression automatique.

Pour télécharger le contenu des fichiers blob dans une version antérieure, utilisez la méthode revisions.get avec l'ID du fichier à télécharger, l'ID de la révision et le paramètre d'URL alt=media. Le paramètre d'URL alt=media indique au serveur qu'un téléchargement de contenu est demandé comme format de réponse alternatif. Comme files.get, la méthode revisions.get accepte également le paramètre de requête facultatif acknowledgeAbuse et l'en-tête Range. Pour en savoir plus, consultez Gérer les opérations de longue durée.

Le protocole de la requête est indiqué ici.

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

Télécharger le contenu d'un fichier blob dans un navigateur

Pour télécharger le contenu des fichiers blob stockés sur Drive dans un navigateur, au lieu de passer par l'API, utilisez le champ webContentLink de la ressource files. Si l'utilisateur a accès au téléchargement du fichier, un lien permettant de télécharger le fichier et son contenu est renvoyé. Vous pouvez rediriger un utilisateur vers cette URL ou la proposer sous forme de lien cliquable.

Télécharger le contenu d'un fichier blob lors d'opérations de longue durée

Pour télécharger le contenu des fichiers blob lors d'opérations de longue durée, utilisez la méthode files.download avec l'ID du fichier à télécharger. Vous pouvez éventuellement définir l'ID de la révision. Il s'agit du seul moyen de télécharger des fichiers Google Vids. Pour en savoir plus, consultez Gérer les opérations de longue durée.

Exporter le contenu d'un document Google Workspace

Pour exporter le contenu en octets d'un document Google Workspace, utilisez la méthode files.export avec l'ID du fichier à exporter et le type MIME approprié. Le contenu exporté est limité à 10 Mo.

L'exemple de code suivant montre comment utiliser la méthode files.export pour exporter un document Google Workspace au format PDF à l'aide des bibliothèques clientes de l'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
<?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;
        }
    }
}

Cet exemple de code utilise le champ d'application restreint drive qui permet aux utilisateurs d'afficher et de gérer tous vos fichiers Drive. Pour en savoir plus sur les habilitations Drive, consultez Choisir les habilitations de l'API Google Drive.

L'exemple de code déclare également le type MIME d'exportation comme application/pdf. Pour obtenir la liste complète de tous les types MIME d'exportation compatibles avec chaque document Google Workspace, consultez Types MIME d'exportation pour les documents Google Workspace.

Exporter le contenu d'un document Google Workspace dans un navigateur

Pour exporter le contenu d'un document Google Workspace dans un navigateur, utilisez le champ exportLinks de la ressource files. Selon le type de document, un lien permettant de télécharger le fichier et son contenu est renvoyé pour chaque type MIME disponible. Vous pouvez rediriger un utilisateur vers une URL ou lui proposer un lien cliquable.

Exporter le contenu d'un document Google Workspace dans une version antérieure dans un navigateur

Pour exporter le contenu d'un document Google Workspace dans une version antérieure d'un navigateur, utilisez la méthode revisions.get avec l'ID du fichier à télécharger et l'ID de la révision pour générer un lien d'exportation à partir duquel vous pouvez effectuer le téléchargement. Si l'utilisateur a accès au téléchargement du fichier, un lien permettant de télécharger le fichier et son contenu est renvoyé. Vous pouvez rediriger un utilisateur vers cette URL ou la proposer sous forme de lien cliquable.

Exporter le contenu de documents Google Workspace lors d'opérations de longue durée

Pour exporter le contenu d'un document Google Workspace lors d'opérations de longue durée, utilisez la méthode files.download avec l'ID du fichier à télécharger et l'ID de la révision. Pour en savoir plus, consultez Gérer les opérations de longue durée.

Limiter le partage de fichiers