Caricare i dati del file

L'API Google Drive ti consente di caricare i dati dei file quando crei o aggiorni una File. Per informazioni su come creare un file contenente solo metadati, ad esempio una cartella, consulta la sezione Creare file di soli metadati.

Puoi eseguire tre tipi di caricamenti:

  • Caricamento semplice (uploadType=media): utilizza questo tipo di caricamento per trasferire un file multimediale di piccole dimensioni (massimo 5 MB) senza fornire metadati. Per eseguire un caricamento semplice, consulta Eseguire un caricamento semplice.

  • Caricamento multiparte (uploadType=multipart): "Utilizza questo tipo di caricamento per trasferire in un'unica richiesta un file di piccole dimensioni (massimo 5 MB) insieme ai metadati che descrivono il file. Per eseguire un caricamento con più parti, consulta Eseguire un caricamento multiparte.

  • Caricamento ripristinabile (uploadType=resumable): utilizza questo tipo di caricamento per i file di grandi dimensioni (maggiori di 5 MB) e quando c'è un'alta probabilità di interruzione della rete, ad esempio quando crei un file da un'app mobile. I caricamenti ripristinabili sono un'ottima scelta anche per la maggior parte delle applicazioni, perché funzionano anche per file di piccole dimensioni al costo minimo di una richiesta HTTP aggiuntiva per caricamento. Per eseguire un caricamento ripristinabile, consulta l'articolo Eseguire un caricamento ripristinabile.

Le librerie client delle API di Google implementano almeno uno di questi tipi di caricamenti. Per ulteriori dettagli su come utilizzare ciascuno di questi tipi, consulta la documentazione relativa alla libreria client.

Usa PATCH rispetto a PUT

Ti ricordiamo che il verbo HTTP PATCH supporta un aggiornamento parziale delle risorse del file, mentre il verbo HTTP PUT supporta la sostituzione completa della risorsa. Tieni presente che PUT può introdurre modifiche che provocano un errore quando aggiunge un nuovo campo a una risorsa esistente.

Quando carichi una risorsa di file, segui queste linee guida:

  • Utilizza il verbo HTTP documentato nel riferimento dell'API per la richiesta iniziale di un caricamento ripristinabile o per l'unica richiesta di un caricamento semplice o multiparte.
  • Utilizza PUT per tutte le richieste successive di un caricamento ripristinabile una volta avviata la richiesta. Queste richieste caricano contenuti, a prescindere dal metodo chiamato.

Eseguire un caricamento semplice

Per eseguire un semplice caricamento, utilizza il metodo files.create con uploadType=media.

Di seguito viene illustrato come eseguire un semplice caricamento:

HTTP

  1. Crea una richiesta POST all'URI /upload del metodo con il parametro di query uploadType=media:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=media

  2. Aggiungi i dati del file al corpo della richiesta.

  3. Aggiungi queste intestazioni HTTP:

    • Content-Type. Imposta il tipo multimediale MIME dell'oggetto che viene caricato.
    • Content-Length. Imposta il numero di byte caricati. Se utilizzi la codifica per il trasferimento in blocchi, questa intestazione non è obbligatoria.
  4. Invia la richiesta. Se la richiesta ha esito positivo, il server restituisce il codice di stato HTTP 200 OK insieme ai metadati del file. {HTTP}

Quando esegui un caricamento semplice, vengono creati i metadati di base e alcuni attributi vengono dedotti dal file, come il tipo MIME o modifiedTime. Puoi utilizzare un semplice caricamento nei casi in cui tu abbia file di piccole dimensioni e i metadati dei file non siano importanti.

Esecuzione di un caricamento multiparte

Una richiesta di caricamento multiparte consente di caricare metadati e dati nella stessa richiesta. Utilizza questa opzione se i dati inviati sono sufficientemente ridotti da poter essere caricati di nuovo nella loro interezza, in caso di problemi di connessione.

Per eseguire un caricamento con più parti, utilizza il metodo files.create con uploadType=multipart.

Di seguito viene illustrato come eseguire un caricamento multiparte:

Java

drive/snippets/drive_v3/src/main/java/UploadBasic.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
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.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate use of Drive insert file API */
public class UploadBasic {

  /**
   * Upload new file.
   *
   * @return Inserted file metadata if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadBasic() 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();
    // Upload file photo.jpg on drive.
    File fileMetadata = new File();
    fileMetadata.setName("photo.jpg");
    // File's content.
    java.io.File filePath = new java.io.File("files/photo.jpg");
    // Specify media type and file-path for file.
    FileContent mediaContent = new FileContent("image/jpeg", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to upload file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/upload_basic.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_basic():
  """Insert new file.
  Returns : Id's of the file uploaded

  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_metadata = {"name": "download.jpeg"}
    media = MediaFileUpload("download.jpeg", mimetype="image/jpeg")
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File ID: {file.get("id")}')

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.get("id")


if __name__ == "__main__":
  upload_basic()

Node.js

drive/snippets/drive_v3/file_snippets/upload_basic.js
/**
 * Insert new file.
 * @return{obj} file Id
 * */
async function uploadBasic() {
  const fs = require('fs');
  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});
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };
  try {
    const file = await service.files.create({
      requestBody,
      media: media,
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadBasic.php
use Google\Client;
use Google\Service\Drive;
# TODO - PHP client currently chokes on fetching start page token
function uploadBasic()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
        'name' => 'photo.jpg'));
        $content = file_get_contents('../files/photo.jpg');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'image/jpeg',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    } 

}

.NET

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

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive insert file API
    public class UploadBasic
    {
        /// <summary>
        /// Upload new file.
        /// </summary>
        /// <param name="filePath">Image path to upload.</param>
        /// <returns>Inserted file metadata if successful, null otherwise.</returns>
        public static string DriveUploadBasic(string filePath)
        {
            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"
                });

                // Upload file photo.jpg on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "photo.jpg"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new file on drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "image/jpeg");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

HTTP

  1. Crea una richiesta POST all'URI /upload del metodo con il parametro di query uploadType=multipart:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart

  2. Crea il corpo della richiesta. Formatta il corpo in base al tipo di contenuti multipart/related RFC 2387, che contiene due parti:

    • Metadati. I metadati devono essere inseriti per primi e devono avere un'intestazione Content-Type impostata su application/json; charset=UTF-8. Aggiungi i metadati del file in formato JSON.
    • Contenuti multimediali. I contenuti multimediali devono essere secondi e devono avere un'intestazione Content-Type di qualsiasi tipo MIME. Aggiungi i dati del file alla parte multimediale.

    Identifica ogni parte con una stringa di confine, preceduta da due trattini. Inoltre, aggiungi due trattini dopo la stringa di confine finale.

  3. Aggiungi queste intestazioni HTTP di primo livello:

    • Content-Type. Impostalo su multipart/related e includi la stringa di confine che stai utilizzando per identificare le diverse parti della richiesta. Ad esempio: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length. Impostalo sul numero totale di byte nel corpo della richiesta.
  4. Invia la richiesta.

Per creare o aggiornare solo la parte dei metadati, senza i dati associati, invia una richiesta POST o PATCH all'endpoint della risorsa standard: https://www.googleapis.com/drive/v3/files Se la richiesta ha esito positivo, il server restituisce il codice di stato HTTP 200 OK insieme ai metadati del file.

Durante la creazione dei file, è necessario specificare un'estensione nel campo name del file. Ad esempio, quando crei un file JPEG di foto, potresti specificare qualcosa come "name": "photo.jpg" nei metadati. Le chiamate successive a files.get restituiscono la proprietà fileExtension di sola lettura contenente l'estensione originariamente specificata nel campo name.

Eseguire un caricamento ripristinabile

Un caricamento ripristinabile ti consente di riprendere un'operazione di caricamento dopo che un errore di comunicazione ha interrotto il flusso dei dati. Poiché non è necessario riavviare i caricamenti di file di grandi dimensioni fin dall'inizio, i caricamenti ripristinabili possono anche ridurre l'utilizzo della larghezza di banda in caso di errore di rete.

I caricamenti ripristinabili sono utili quando le dimensioni dei file possono variare notevolmente o quando esiste un limite di tempo fisso per le richieste (ad esempio le attività in background del sistema operativo mobile e determinate richieste di App Engine). Puoi anche utilizzare caricamenti ripristinabili nelle situazioni in cui vuoi mostrare una barra di avanzamento.

Un caricamento ripristinabile è costituito da diversi passaggi generali:

  1. Invia la richiesta iniziale e recupera l'URI della sessione ripristinabile.
  2. Caricare i dati e monitorare lo stato di caricamento.
  3. (Facoltativo) Se il caricamento è disturbato, riprendilo.

Invia la richiesta iniziale

Per avviare un caricamento ripristinabile, utilizza il metodo files.create con uploadType=resumable.

HTTP

  1. Crea una richiesta POST all'URI /upload del metodo con il parametro di query uploadType=resumable:

    POST https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable

    Se la richiesta di avvio ha esito positivo, la risposta include un codice di stato HTTP 200 OK. Inoltre, include un'intestazione Location che specifica l'URI della sessione ripristinabile:

    HTTP/1.1 200 OK
    Location: https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable&upload_id=xa298sd_sdlkj2
    Content-Length: 0
    

    Salva l'URI della sessione ripristinabile in modo da poter caricare i dati del file ed eseguire query sullo stato di caricamento. Un URI di sessione ripristinabile scade dopo una settimana.

  2. Se disponi di metadati per il file, aggiungili al corpo della richiesta in formato JSON. In caso contrario, lascia vuoto il corpo della richiesta.

  3. Aggiungi queste intestazioni HTTP:

    • X-Upload-Content-Type. Facoltativa. Impostato sul tipo MIME dei dati del file, che viene trasferito nelle richieste successive. Se il tipo MIME dei dati non è specificato nei metadati o tramite questa intestazione, l'oggetto viene pubblicato come application/octet-stream.
    • X-Upload-Content-Length. Facoltativa. Impostato sul numero di byte dei dati del file, che vengono trasferiti nelle richieste successive.
    • Content-Type. Obbligatorio se disponi di metadati per il file. Imposta su application/json; charset=UTF-8.
    • Content-Length. Obbligatorio, a meno che non utilizzi la codifica di trasferimento in blocchi. Impostalo sul numero di byte nel corpo di questa richiesta iniziale.
  4. Invia la richiesta. Se la richiesta di avvio della sessione ha esito positivo, la risposta include un codice di stato 200 OK HTTP. Inoltre, la risposta include un'intestazione Location che specifica l'URI della sessione ripristinabile. Utilizza l'URI di sessione ripristinabile per caricare i dati del file ed eseguire query sullo stato del caricamento. Un URI di sessione ripristinabile scade dopo una settimana.

  5. Copia e salva l'URL della sessione ripristinabile.

  6. Vai alla sezione Caricare i contenuti.

Carica i contenuti

Esistono due modi per caricare un file con una sessione ripristinabile:

  • Carica i contenuti in una singola richiesta: utilizza questo approccio quando il file può essere caricato in una singola richiesta, se non esiste un limite di tempo fisso per ogni singola richiesta o se non è necessario visualizzare un indicatore di avanzamento del caricamento. Questo approccio è migliore perché richiede meno richieste e migliora le prestazioni.
  • Carica i contenuti in più blocchi: utilizza questo approccio se devi ridurre la quantità di dati trasferiti in ogni singola richiesta. Potrebbe essere necessario ridurre i dati trasferiti quando esiste un limite di tempo fisso per le singole richieste, come può accadere per determinate classi di richieste di App Engine. Questo approccio è utile anche se devi fornire un indicatore personalizzato per mostrare l'avanzamento del caricamento.

HTTP - richiesta singola

  1. Crea una richiesta PUT all'URI della sessione ripristinabile.
  2. Aggiungi i dati del file al corpo della richiesta.
  3. Aggiungi un'intestazione HTTP Content-Length, impostata sul numero di byte nel file.
  4. Invia la richiesta. Se la richiesta di caricamento viene interrotta o se ricevi una risposta 5xx, segui la procedura descritta in Riprendere un caricamento interrotto.

HTTP - richieste multiple

  1. Crea una richiesta PUT all'URI della sessione ripristinabile.

  2. Aggiungi i dati del blocco al corpo della richiesta. Crea blocchi di dimensioni multiple di 256 kB (256 x 1024 byte), ad eccezione del blocco finale che completa il caricamento. Mantieni le dimensioni del blocco il più possibile in modo che il caricamento sia efficace.

  3. Aggiungi queste intestazioni HTTP:

    • Content-Length. Imposta il numero di byte nel blocco attuale.
    • Content-Range. Impostala in modo che mostri i byte del file che carichi. Ad esempio, Content-Range: bytes 0-524287/2000000 mostra che hai caricato i primi 524.288 byte (256 x 1024 x 2) in un file di 2.000.000 di byte.
  4. Invia la richiesta ed elabora la risposta. Se la richiesta di caricamento viene interrotta o se ricevi una risposta 5xx, segui la procedura descritta in Riprendere un caricamento interrotto.

  5. Ripeti i passaggi da 1 a 4 per ogni blocco rimasto nel file. Utilizza l'intestazione Range nella risposta per determinare da dove iniziare il blocco successivo. Non dare per scontato che il server abbia ricevuto tutti i byte inviati nella richiesta precedente.

Al termine del caricamento del file, riceverai una risposta 200 OK o 201 Created, insieme a tutti i metadati associati alla risorsa.

Riprendere un caricamento interrotto

Se una richiesta di caricamento viene interrotta prima di una risposta o se ricevi una risposta 503 Service Unavailable, devi riprendere il caricamento interrotto.

HTTP

  1. Per richiedere lo stato di caricamento, crea una richiesta PUT vuota all'URI della sessione ripristinabile.

  2. Aggiungi un'intestazione Content-Range per indicare che la posizione corrente nel file è sconosciuta. Ad esempio, imposta Content-Range su */2000000 se la lunghezza totale del file è di 2.000.000 di byte. Se non conosci la dimensione intera del file, imposta Content-Range su */*.

  3. Invia la richiesta.

  4. Elabora la risposta:

    • Una risposta 200 OK o 201 Created indica che il caricamento è stato completato e non sono necessarie ulteriori azioni.
    • Una risposta 308 Resume Incomplete indica che devi continuare per caricare il file.
    • Una risposta 404 Not Found indica che la sessione di caricamento è scaduta e il caricamento deve essere riavviato dall'inizio.
  5. Se hai ricevuto una risposta 308 Resume Incomplete, elabora l'intestazione Range della risposta per determinare quali byte sono stati ricevuti dal server. Se la risposta non ha un'intestazione Range, non sono stati ricevuti byte. Ad esempio, un'intestazione Range di bytes=0-42 indica che sono stati ricevuti i primi 43 byte del file e che il blocco successivo da caricare inizia con il byte 44.

  6. Ora che sai dove riprendere il caricamento, continua a caricare il file iniziando con il byte successivo. Includi un'intestazione Content-Range per indicare la parte del file che invii. Ad esempio, Content-Range: bytes 43-1999999 indica che invii i byte da 44 a 2.000.000.

Gestire gli errori di caricamento dei contenuti multimediali

Quando carichi contenuti multimediali, segui queste best practice per gestire gli errori:

  • Per gli errori 5xx, riprendi o riprova i caricamenti che non riescono a causa di interruzioni della connessione. Per ulteriori informazioni sulla gestione degli errori 5xx, consulta Errori 500, 502, 503, 504.
  • Per 403 rate limit errori, riprova a eseguire il caricamento. Per ulteriori informazioni sulla gestione degli errori 403 rate limit, consulta Errore 403: rateLimitExceeded.
  • Per eventuali errori 4xx (incluso 403) durante un caricamento ripristinabile, riavvia il caricamento. Questi errori indicano che la sessione di caricamento è scaduta e devono essere riavviati richiedendo un nuovo URI di sessione. Anche le sessioni di caricamento scadono dopo una settimana di inattività.

Importa nei tipi di Documenti Google

Quando crei un file in Drive, ti consigliamo di convertirlo in un tipo di file di Google Workspace, come Documenti o Fogli Google. Ad esempio, potresti voler trasformare un documento dal tuo elaboratore di testi preferito in Documenti per sfruttarne le funzionalità.

Per convertire un file in un tipo di file specifico di Google Workspace, specifica il mimeType di Google Workspace durante la creazione del file.

Di seguito viene mostrato come convertire un file CSV in un foglio di Google Workspace:

Java

drive/snippets/drive_v3/src/main/java/UploadWithConversion.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.FileContent;
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.api.services.drive.model.File;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;

/* Class to demonstrate Drive's upload with conversion use-case. */
public class UploadWithConversion {

  /**
   * Upload file with conversion.
   *
   * @return Inserted file id if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static String uploadWithConversion() 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();

    // File's metadata.
    File fileMetadata = new File();
    fileMetadata.setName("My Report");
    fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet");

    java.io.File filePath = new java.io.File("files/report.csv");
    FileContent mediaContent = new FileContent("text/csv", filePath);
    try {
      File file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute();
      System.out.println("File ID: " + file.getId());
      return file.getId();
    } 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/upload_with_conversion.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaFileUpload


def upload_with_conversion():
  """Upload file with conversion
  Returns: ID of the file uploaded

  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_metadata = {
        "name": "My Report",
        "mimeType": "application/vnd.google-apps.spreadsheet",
    }
    media = MediaFileUpload("report.csv", mimetype="text/csv", resumable=True)
    # pylint: disable=maybe-no-member
    file = (
        service.files()
        .create(body=file_metadata, media_body=media, fields="id")
        .execute()
    )
    print(f'File with ID: "{file.get("id")}" has been uploaded.')

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.get("id")


if __name__ == "__main__":
  upload_with_conversion()

Node.js

drive/snippets/drive_v3/file_snippets/upload_with_conversion.js
/**
 * Upload file with conversion
 * @return{obj} file Id
 * */
async function uploadWithConversion() {
  const fs = require('fs');
  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});
  const fileMetadata = {
    name: 'My Report',
    mimeType: 'application/vnd.google-apps.spreadsheet',
  };
  const media = {
    mimeType: 'text/csv',
    body: fs.createReadStream('files/report.csv'),
  };

  try {
    const file = await service.files.create({
      resource: fileMetadata,
      media: media,
      fields: 'id',
    });
    console.log('File Id:', file.data.id);
    return file.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveUploadWithConversion.php
use Google\Client;
use Google\Service\Drive;
function uploadWithConversion()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $fileMetadata = new Drive\DriveFile(array(
            'name' => 'My Report',
            'mimeType' => 'application/vnd.google-apps.spreadsheet'));
        $content = file_get_contents('../files/report.csv');
        $file = $driveService->files->create($fileMetadata, array(
            'data' => $content,
            'mimeType' => 'text/csv',
            'uploadType' => 'multipart',
            'fields' => 'id'));
        printf("File ID: %s\n", $file->id);
        return $file->id;
    } catch(Exception $e) {
        echo "Error Message: ".$e;
    }

}

.NET

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

namespace DriveV3Snippets
{
    // Class to demonstrate Drive's upload with conversion use-case.
    public class UploadWithConversion
    {
        /// <summary>
        /// Upload file with conversion.
        /// </summary>
        /// <param name="filePath">Id of the spreadsheet file.</param>
        /// <returns>Inserted file id if successful, null otherwise.</returns>
        public static string DriveUploadWithConversion(string filePath)
        {
            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"
                });

                // Upload file My Report on drive.
                var fileMetadata = new Google.Apis.Drive.v3.Data.File()
                {
                    Name = "My Report",
                    MimeType = "application/vnd.google-apps.spreadsheet"
                };
                FilesResource.CreateMediaUpload request;
                // Create a new drive.
                using (var stream = new FileStream(filePath,
                           FileMode.Open))
                {
                    // Create a new file, with metadata and stream.
                    request = service.Files.Create(
                        fileMetadata, stream, "text/csv");
                    request.Fields = "id";
                    request.Upload();
                }

                var file = request.ResponseBody;
                // Prints the uploaded file id.
                Console.WriteLine("File ID: " + file.Id);
                return file.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else if (e is FileNotFoundException)
                {
                    Console.WriteLine("File not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Per verificare se è disponibile una conversione, controlla l'array importFormats della risorsa about prima di creare il file. Le conversioni supportate sono disponibili in modo dinamico in questo array. Alcuni dei formati di importazione più comuni sono:

DaTo
Microsoft Word, testo OpenDocument, HTML, RTF, testo normaleDocumenti Google
Microsoft Excel, OpenDocument sheet, CSV, TSV, testo normaleFogli Google
Microsoft PowerPoint, OpenDocument presentazionePresentazioni Google
JPEG, PNG, GIF, BMP, PDFDocumenti Google (incorpora l'immagine in un documento)
Testo normale (tipo MIME speciale), JSONGoogle Apps Script

Quando carichi e converti i contenuti multimediali durante una richiesta update in un file di Documenti, Fogli o Presentazioni, vengono sostituiti tutti i contenuti del documento.

Quando converti un'immagine in Documenti, Drive usa il riconoscimento ottico dei caratteri (OCR) per convertire l'immagine in testo. Puoi migliorare la qualità dell'algoritmo OCR specificando il codice lingua BCP 47 applicabile nel parametro ocrLanguage. Il testo estratto viene visualizzato nel documento accanto all'immagine incorporata.

Utilizza un ID pregenerato per caricare file

L'API Drive consente di recuperare un elenco di ID file pregenerati che vengono utilizzati per caricare e creare risorse. Le richieste di caricamento e creazione di file possono usare questi ID pregenerati. Imposta il campo id nei metadati del file.

Per creare ID pregenerati, chiama files.generateIds con il numero di ID da creare.

Puoi riprovare in sicurezza i caricamenti con ID pregenerati in caso di timeout o errore del server indeterminato. Se il file è stato creato correttamente, i tentativi successivi restituiscono un errore HTTP 409 e non creano file duplicati.

Definisci testo indicizzabile per tipi di file sconosciuti

Gli utenti possono utilizzare l'interfaccia utente di Drive per trovare i contenuti dei documenti. Puoi anche utilizzare files.list e il campo fullText per cercare contenuti dalla tua app. Per ulteriori informazioni, vedi Cercare file e cartelle.

Drive indicizza automaticamente i documenti per la ricerca quando riconosce il tipo di file, inclusi documenti di testo, PDF, immagini con testo e altri tipi comuni. Se l'app salva altri tipi di file (ad esempio disegni, video e scorciatoie), puoi migliorarne la rilevabilità fornendo testo indicizzabile nel campo contentHints.indexableText del file.

Per ulteriori informazioni sul testo indicizzabile, consulta Gestire i metadati dei file.