Scaricare ed esportare file

L'API Google Drive supporta diversi tipi di azioni di download ed esportazione, come elencato nella tabella seguente:

Azioni di download
Contenuti del file BLOB utilizzando il metodo files.get con il parametro URL alt=media.
Contenuti del file BLOB in una versione precedente utilizzando il metodo revisions.get con il parametro URL alt=media.
Contenuti del file blob in un browser utilizzando il campo webContentLink.
Contenuti dei file BLOB utilizzando il metodo files.download durante le operazioni a lunga esecuzione. Questo è l'unico modo per scaricare i file Google Vids.
Azioni di esportazione
Contenuti dei documenti di Google Workspace in un formato che la tua app può gestire, utilizzando il metodo files.export.
Contenuti del documento di Google Workspace in un browser utilizzando il campo exportLinks.
Contenuti di un documento Google Workspace di una versione precedente in un browser utilizzando il campo exportLinks.
Contenuti dei documenti di Google Workspace utilizzando il metodo files.download durante le operazioni di lunga durata.

Prima di scaricare o esportare i contenuti dei file, verifica che gli utenti possano scaricare il file utilizzando il campo capabilities.canDownload nella risorsa files.

Per descrizioni dei tipi di file menzionati qui, inclusi i file blob e Google Workspace, consulta Tipi di file.

Il resto di questa guida fornisce istruzioni dettagliate per eseguire questi tipi di azioni di download ed esportazione.

Scaricare i contenuti del file blob

Per scaricare un file BLOB archiviato su Drive, utilizza il metodo files.get con l'ID del file da scaricare e il parametro URL alt=media. Il parametro URL alt=media indica al server che è stato richiesto il download dei contenuti come formato di risposta alternativo.

Il parametro URL alt=media è un parametro di sistema disponibile in tutte le API REST di Google. Se utilizzi una libreria client per l'API Drive, non è necessario impostare esplicitamente questo parametro.

L'esempio di codice seguente mostra come utilizzare il metodo files.get per scaricare un file con le librerie client dell'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;
        }
    }
}

Questo esempio di codice utilizza un metodo della libreria che aggiunge il parametro URL alt=media alla richiesta HTTP sottostante.

I download di file avviati dalla tua app devono essere autorizzati con un ambito che consenta l'accesso in lettura ai contenuti dei file. Ad esempio, un'app che utilizza l'ambito drive.readonly.metadata non è autorizzata a scaricare i contenuti del file. Questo esempio di codice utilizza l'ambito file "drive" limitato che consente agli utenti di visualizzare e gestire tutti i tuoi file di Drive. Per scoprire di più sugli ambiti di Drive, consulta Scegliere gli ambiti dell'API Google Drive.

Gli utenti con autorizzazioni di modifica possono limitare il download da parte degli utenti di sola lettura impostando il campo copyRequiresWriterPermission su false.

I file identificati come abusivi (ad esempio software dannosi) sono scaricabili solo dal proprietario del file. Inoltre, deve essere incluso il parametro di query get acknowledgeAbuse=true per indicare che l'utente ha accettato il rischio di scaricare software potenzialmente indesiderato o altri file illeciti. L'applicazione deve avvisare l'utente in modo interattivo prima di utilizzare questo parametro di query.

Download parziale

Il download parziale prevede il download solo di una parte specifica di un file. Puoi specificare la parte del file che vuoi scaricare utilizzando un intervallo di byte con l'intestazione Range. Ad esempio:

Range: bytes=500-999

Scaricare i contenuti del file blob in una versione precedente

Per scaricare i contenuti dei file blob di una versione precedente, utilizza il metodo revisions.get con l'ID del file da scaricare, l'ID della revisione e il parametro URL alt=media. Il parametro URL alt=media indica al server che è stato richiesto il download dei contenuti come formato di risposta alternativo. Analogamente a files.get, il metodo revisions.get accetta anche il parametro di query facoltativo acknowledgeAbuse e l'intestazione Range. Per ulteriori informazioni sul download delle revisioni, consulta Gestire le revisioni dei file.

Il protocollo di richiesta è mostrato qui.

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

Scaricare i contenuti dei file BLOB in un browser

Per scaricare i contenuti dei file BLOB archiviati su Drive all'interno di un browser, anziché tramite l'API, utilizza il campo webContentLink della risorsa files. Se l'utente ha accesso al download del file, viene restituito un link per scaricare il file e i relativi contenuti. Puoi reindirizzare un utente a questo URL o offrirlo come link cliccabile.

Scaricare i contenuti dei file BLOB durante le operazioni a lunga esecuzione

Per scaricare i contenuti dei file BLOB durante le operazioni che richiedono molto tempo, utilizza il metodo files.download con l'ID del file da scaricare. Se vuoi, puoi impostare l'ID della revisione. Questo è l'unico modo per scaricare i file di Google Vids. Per ulteriori informazioni, consulta Gestire operazioni che richiedono molto tempo.

Esportare i contenuti dei documenti di Google Workspace

Per esportare i contenuti in byte dei documenti di Google Workspace, utilizza il metodo files.export con l'ID del file da esportare e il tipo MIME corretto. I contenuti esportati sono limitati a 10 MB.

Il seguente esempio di codice mostra come utilizzare il metodo files.export per esportare un documento Google Workspace in formato PDF utilizzando le librerie client dell'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;
        }
    }
}

Questo esempio di codice utilizza l'ambito limitato drive che consente agli utenti di visualizzare e gestire tutti i tuoi file di Drive. Per scoprire di più sugli ambiti di Drive, consulta Scegliere gli ambiti dell'API Google Drive.

L'esempio di codice dichiara anche il tipo MIME di esportazione come application/pdf. Per un elenco completo di tutti i tipi MIME di esportazione supportati per ogni documento Google Workspace, consulta Tipi MIME di esportazione per i documenti Google Workspace.

Esportare i contenuti dei documenti di Google Workspace in un browser

Per esportare i contenuti dei documenti di Google Workspace in un browser, utilizza il campo exportLinks della risorsa files. A seconda del tipo di documento, viene restituito un link per scaricare il file e i relativi contenuti per ogni tipo MIME disponibile. Puoi reindirizzare un utente a un URL o offrirlo come link cliccabile.

Esportare i contenuti di un documento di Google Workspace in una versione precedente in un browser

Per esportare i contenuti di un documento di Google Workspace in una versione precedente all'interno di un browser, utilizza il metodo revisions.get con l'ID del file da scaricare e l'ID della revisione per generare un link di esportazione da cui puoi eseguire il download. Se l'utente ha accesso al download del file, viene restituito un link per scaricare il file e i relativi contenuti. Puoi reindirizzare un utente a questo URL o offrirlo come link cliccabile.

Esportare i contenuti dei documenti di Google Workspace durante le operazioni di lunga durata

Per esportare i contenuti dei documenti di Google Workspace durante le operazioni che richiedono molto tempo, utilizza il metodo files.download con l'ID del file da scaricare e l'ID della revisione. Per ulteriori informazioni, consulta Gestire le operazioni che richiedono molto tempo.