Subir datos de archivos

La API de Google Drive te permite subir datos de archivos cuando creas o actualizas un File. Para obtener información sobre cómo crear un archivo solo de metadatos, como una carpeta, consulta Crea archivos solo de metadatos.

Existen tres tipos de cargas que puedes realizar:

  • Carga simple (uploadType=media): Usa este tipo de carga para transferir un archivo multimedia pequeño (5 MB o menos) sin proporcionar metadatos. Para realizar una carga simple, consulta Cómo realizar una carga simple.

  • Carga dividida en partes (uploadType=multipart): "Usa este tipo de carga para transferir un archivo pequeño (5 MB o menos) junto con los metadatos que lo describen en una sola solicitud. Para realizar una carga multiparte, consulta Cómo realizar una carga multiparte.

  • Carga reanudable (uploadType=resumable): Usa este tipo de carga para archivos grandes (más de 5 MB) y cuando haya una gran probabilidad de interrupción de la red, como cuando se crea un archivo desde una app para dispositivos móviles. Las cargas reanudables también son una buena opción para la mayoría de las aplicaciones, ya que también funcionan con archivos pequeños con un costo mínimo de una solicitud HTTP adicional por carga. Para realizar una carga reanudable, consulta Realiza una carga reanudable.

Las bibliotecas cliente de la API de Google implementan al menos uno de estos tipos de cargas. Consulta la documentación de la biblioteca cliente para obtener más detalles sobre cómo usar cada uno de los tipos.

Usa PATCH en lugar de PUT

A modo de repaso, el verbo HTTP PATCH admite una actualización parcial de recursos de archivo, mientras que el verbo HTTP PUT admite el reemplazo completo de recursos. Ten en cuenta que PUT puede generar cambios drásticos cuando se agrega un campo nuevo a un recurso existente.

Cuando subas un recurso de archivo, sigue los lineamientos que se indican a continuación:

  • Usa el verbo HTTP documentado en la referencia de la API para la solicitud inicial de una carga reanudable o para la única solicitud de una carga simple o multiparte.
  • Usa PUT para todas las solicitudes posteriores de una carga reanudable una vez que se haya iniciado la solicitud. Estas solicitudes suben contenido sin importar el método al que se llame.

Realiza una carga simple

Para realizar una carga simple, usa el método files.create con uploadType=media.

A continuación, se muestra cómo realizar una carga simple:

HTTP

  1. Crea una solicitud POST al URI /upload del método con el parámetro de consulta uploadType=media:

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

  2. Agrega los datos del archivo al cuerpo de la solicitud.

  3. Agrega los siguientes encabezados HTTP:

    • Content-Type. Se establece en el tipo de MIME multimedia del objeto que se carga.
    • Content-Length. Se establece como la cantidad de bytes que subes. Si usas la codificación de transferencia fragmentada, no es necesario este encabezado.
  4. Envía la solicitud. Si la solicitud se realiza correctamente, el servidor muestra el código de estado HTTP 200 OK junto con los metadatos del archivo. {HTTP}

Cuando realizas una carga simple, se crean metadatos básicos y se infieren algunos atributos del archivo, como el tipo de MIME o modifiedTime. Puedes usar una carga simple en los casos en los que tienes archivos pequeños y los metadatos de los archivos no son importantes.

Cómo realizar una carga multiparte

Una solicitud de carga multiparte te permite subir metadatos y datos en la misma solicitud. Usa esta opción si los datos que envías son lo suficientemente pequeños como para volver a subirlos por completo si falla la conexión.

Para realizar una carga multiparte, usa el método files.create con uploadType=multipart.

A continuación, se muestra cómo realizar una carga de varias partes:

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 solicitud POST al URI /upload del método con el parámetro de consulta uploadType=multipart:

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

  2. Crea el cuerpo de la solicitud. Dale formato al cuerpo según el tipo de contenido multipart/related RFC 2387, que contiene dos partes:

    • Metadatos. Los metadatos deben ir primero y deben tener un encabezado Content-Type configurado en application/json; charset=UTF-8. Agrega los metadatos del archivo en formato JSON.
    • Contenido multimedia. El contenido multimedia debe ir en segundo lugar y debe tener un encabezado Content-Type de cualquier tipo de MIME. Agrega los datos del archivo a la parte multimedia.

    Identifica cada parte con una cadena de límite, precedida de dos guiones. Además, agrega dos guiones después de la última cadena de límite.

  3. Agrega los siguientes encabezados HTTP de nivel superior:

    • Content-Type. Se establece como multipart/related; incluye la cadena de límite que usas para identificar las diferentes partes de la solicitud. Por ejemplo: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length. Configurado como la cantidad total de bytes en el cuerpo de la solicitud.
  4. Envía la solicitud.

Para crear o actualizar solo la parte de metadatos, sin los datos asociados, envía una solicitud POST o PATCH al extremo de recurso estándar: https://www.googleapis.com/drive/v3/files Si la solicitud se realiza correctamente, el servidor muestra el código de estado HTTP 200 OK junto con los metadatos del archivo.

Cuando crees archivos, debes especificar una extensión de archivo en el campo name del archivo. Por ejemplo, cuando creas un archivo JPEG de foto, puedes especificar algo como "name": "photo.jpg" en los metadatos. Las llamadas posteriores a files.get muestran la propiedad fileExtension de solo lectura que contiene la extensión especificada originalmente en el campo name.

Realiza una carga reanudable

Una carga reanudable te permite reanudar una operación de carga después de que una falla de comunicación interrumpe el flujo de datos. Debido a que no es necesario reiniciar grandes cargas de archivos desde el principio, las cargas reanudables también pueden reducir el uso de ancho de banda si hay una falla de red.

Las cargas reanudables son útiles cuando los tamaños de los archivos pueden variar mucho o cuando hay un límite de tiempo fijo para las solicitudes (como las tareas en segundo plano del SO para dispositivos móviles y ciertas solicitudes de App Engine). También puedes usar cargas reanudables en situaciones en las que quieras mostrar una barra de progreso de carga.

Una carga reanudable consta de varios pasos de alto nivel:

  1. Envía la solicitud inicial y recupera el URI de la sesión reanudable.
  2. Sube los datos y supervisa el estado de carga.
  3. Si se interrumpe la carga, reanuda la carga (opcional).

Envía la solicitud inicial

Para iniciar una carga reanudable, usa el método files.create con uploadType=resumable.

HTTP

  1. Crea una solicitud POST al URI /upload del método con el parámetro de consulta uploadType=resumable:

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

    Si la solicitud de inicio se realiza correctamente, la respuesta incluye un código de estado HTTP 200 OK. Además, incluye un encabezado Location que especifica el URI de la sesión reanudable:

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

    Guarda el URI de la sesión reanudable para que puedas subir los datos del archivo y consultar el estado de la carga. Los URIs de sesión reanudables vencen después de una semana.

  2. Si tienes metadatos para el archivo, agrégalos al cuerpo de la solicitud en formato JSON. De lo contrario, deja el cuerpo de la solicitud vacío.

  3. Agrega los siguientes encabezados HTTP:

    • X-Upload-Content-Type. Es opcional. Se establece en el tipo de MIME de los datos del archivo, que se transfieren en solicitudes posteriores. Si el tipo de MIME de los datos no se especifica en los metadatos ni a través de este encabezado, el objeto se entrega como application/octet-stream..
    • X-Upload-Content-Length. Es opcional. Se establece en la cantidad de bytes de los datos del archivo, que se transfieren en solicitudes posteriores.
    • Content-Type. Es obligatorio si existen metadatos para el archivo. Se establece en application/json; charset=UTF-8.
    • Content-Length. Es obligatorio, a menos que uses la codificación de transferencia fragmentada. Se establece en la cantidad de bytes del cuerpo de esta solicitud inicial.
  4. Envía la solicitud. Si la solicitud de inicio de sesión se realiza de manera correcta, la respuesta incluye un código de estado 200 OK HTTP. Además, la respuesta incluye un encabezado Location que especifica el URI de la sesión reanudable. Usa el URI de la sesión reanudable para subir los datos del archivo y consultar el estado de la carga. Los URIs de sesión reanudables vencen después de una semana.

  5. Copia y guarda la URL de la sesión reanudable.

  6. Continúa con Subir el contenido.

Sube el contenido

Existen dos formas de subir un archivo con una sesión reanudable:

  • Sube contenido en una sola solicitud: Usa este enfoque cuando el archivo se pueda subir en una solicitud, si no hay un límite de tiempo fijo para ninguna solicitud o si no necesitas mostrar un indicador de progreso de carga. Este enfoque es mejor porque requiere menos solicitudes y genera un mejor rendimiento.
  • Sube el contenido en varios fragmentos: Usa este enfoque si debes reducir la cantidad de datos transferidos en una sola solicitud. Es posible que debas reducir los datos transferidos cuando haya un límite de tiempo fijo para solicitudes individuales, como puede ser el caso de ciertas clases de solicitudes de App Engine. Este enfoque también es útil si debes proporcionar un indicador personalizado para mostrar el progreso de la carga.

HTTP: Solicitud única

  1. Crea una solicitud PUT para el URI de la sesión reanudable.
  2. Agrega los datos del archivo al cuerpo de la solicitud.
  3. Agrega un encabezado HTTP Content-Length, establecido en la cantidad de bytes del archivo.
  4. Envía la solicitud. Si la solicitud de carga se interrumpe o si recibes una respuesta 5xx, sigue el procedimiento que se describe en Cómo reanudar una carga interrumpida.

HTTP: varias solicitudes

  1. Crea una solicitud PUT para el URI de la sesión reanudable.

  2. Agrega los datos del fragmento al cuerpo de la solicitud. Crea fragmentos en múltiplos de 256 KB (256 x 1,024 bytes), a excepción del último fragmento que completa la carga. El tamaño del fragmento debe ser lo más grande posible para que la carga sea eficaz.

  3. Agrega los siguientes encabezados HTTP:

    • Content-Length. Se establece en la cantidad de bytes del fragmento actual.
    • Content-Range. Se establece para mostrar qué bytes del archivo subes. Por ejemplo, Content-Range: bytes 0-524287/2000000 muestra que subes los primeros 524,288 bytes (256 x 1,024 x 2) de un archivo de 2,000,000 bytes.
  4. Envía la solicitud y procesa la respuesta. Si la solicitud de carga se interrumpe o si recibes una respuesta 5xx, sigue el procedimiento que se describe en Cómo reanudar una carga interrumpida.

  5. Repite los pasos del 1 al 4 para cada fragmento que quede en el archivo. Usa el encabezado Range de la respuesta para determinar dónde iniciar el siguiente fragmento. No des por sentado que el servidor recibió todos los bytes enviados en la solicitud anterior.

Cuando se complete la carga del archivo, recibirás una respuesta 200 OK o 201 Created, junto con los metadatos asociados al recurso.

Reanuda una carga interrumpida

Si una solicitud de carga se interrumpe antes de que se reciba una respuesta, o si recibes una respuesta 503 Service Unavailable, debes reanudar la carga interrumpida.

HTTP

  1. Crea una solicitud PUT vacía para el URI de sesión reanudable a fin de solicitar el estado de la carga.

  2. Agrega un encabezado Content-Range que indique que se desconoce la posición actual en el archivo. Por ejemplo, si el tamaño total del archivo es de 2,000,000 de bytes, establece Content-Range en */2000000. Si no sabes el tamaño del archivo, establece Content-Range en */*.

  3. Envía la solicitud.

  4. Procesa la respuesta:

    • Una respuesta 200 OK o 201 Created indica que se completó la carga y que no es necesario realizar ninguna otra acción.
    • Una respuesta 308 Resume Incomplete indica que debes seguir subiendo el archivo.
    • Una respuesta 404 Not Found indica que la sesión de carga venció y que se debe reiniciar desde el principio.
  5. Si recibiste una respuesta 308 Resume Incomplete, procesa el encabezado Range de la respuesta para determinar qué bytes recibió el servidor. Si la respuesta no tiene un encabezado Range, significa que no se recibieron bytes. Por ejemplo, un encabezado Range de bytes=0-42 indica que se recibieron los primeros 43 bytes del archivo y que el siguiente fragmento que se subirá comenzará con el byte 44.

  6. Ahora que sabes dónde reanudar la carga, continúa subiendo el archivo a partir del siguiente byte. Debes incluir un encabezado Content-Range para indicar qué parte del archivo envías. Por ejemplo, Content-Range: bytes 43-1999999 indica que envías 44 bytes a través de 2,000,000.

Cómo controlar los errores de carga de contenido multimedia

Cuando subas contenido multimedia, sigue estas prácticas recomendadas para controlar los errores:

  • En el caso de los errores 5xx, reanuda o vuelve a intentar las cargas que no se realizaron correctamente debido a interrupciones en la conexión. Para obtener más información sobre cómo manejar los errores 5xx, consulta Errores 500, 502, 503 y 504.
  • En caso de errores 403 rate limit, vuelve a intentar la carga. Para obtener más información sobre el manejo de errores 403 rate limit, consulta Error 403: rateLimitExceeded.
  • Si se produce algún error 4xx (incluido 403) durante una carga reanudable, reinicia la carga. Estos errores indican que la sesión de carga expiró y se debe reiniciar solicitando un nuevo URI de sesión. Las sesiones de carga también vencen después de una semana de inactividad.

Tipos de importación a Documentos de Google

Cuando crees un archivo en Drive, te recomendamos que lo conviertas en un tipo de archivo de Google Workspace, como Documentos o Hojas de cálculo de Google. Por ejemplo, tal vez quieras transformar un documento de tu procesador de texto favorito en un documento de Documentos para aprovechar sus funciones.

Para convertir un archivo a un tipo de archivo de Google Workspace específico, especifica el mimeType de Google Workspace cuando crees el archivo.

A continuación, se muestra cómo convertir un archivo CSV en una hoja de 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({
      requestBody: 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;
        }
    }
}

Para ver si hay una conversión disponible, verifica el array importFormats del recurso about antes de crear el archivo. Las conversiones admitidas están disponibles de forma dinámica en este array. Estos son algunos formatos de importación comunes:

DePara
Microsoft Word, OpenDocument Text, HTML, RTF y texto sin formatoDocumentos de Google
Microsoft Excel, hoja de cálculo de OpenDocument, CSV, TSV, texto sin formatoHojas de cálculo de Google
Microsoft PowerPoint, presentación de OpenDocumentPresentaciones de Google
JPEG, PNG, GIF, BMP y PDFDocumentos de Google (incorpora la imagen en un documento)
Texto sin formato (tipo MIME especial), JSONGoogle Apps Script

Cuando subes y conviertes contenido multimedia durante una solicitud update a un archivo de Documentos, Hojas de cálculo o Presentaciones, se reemplaza todo el contenido del documento.

Cuando conviertes una imagen en un archivo de Documentos, Drive usa el reconocimiento óptico de caracteres (OCR) para convertirla en texto. Puedes mejorar la calidad del algoritmo de OCR especificando el código de idioma BCP 47 aplicable en el parámetro ocrLanguage. El texto extraído aparecerá en el documento junto con la imagen incorporada.

Usa un ID generado previamente para subir archivos

La API de Drive te permite recuperar una lista de IDs de archivos generados previamente que se usan para subir y crear recursos. Las solicitudes de carga y creación de archivos pueden usar estos IDs generados previamente. Configura el campo id en los metadatos del archivo.

Para crear IDs generados previamente, llama a files.generateIds con la cantidad de IDs que deseas crear.

Puedes volver a intentar las cargas de forma segura con IDs generados previamente si hay un error de servidor indeterminado o un tiempo de espera. Si el archivo se creó correctamente, los reintentos posteriores muestran un error HTTP 409 y no crean archivos duplicados.

Define texto indexable para tipos de archivos desconocidos

Los usuarios pueden usar la IU de Drive para encontrar el contenido de los documentos. También puedes usar files.list y el campo fullText para buscar contenido desde tu app. Para obtener más información, consulta Cómo buscar archivos y carpetas.

Drive indexa automáticamente los documentos para la búsqueda cuando reconoce el tipo de archivo, incluidos los documentos de texto, los archivos PDF, las imágenes con texto y otros tipos comunes. Si tu app guarda otros tipos de archivos (como dibujos, videos y atajos), puedes mejorar la visibilidad proporcionando texto indexable en el campo contentHints.indexableText del archivo.

Para obtener más información sobre el texto indexable, consulta Administra los metadatos de archivos.