Fazer upload dos dados do arquivo

A API Google Drive permite fazer upload de dados de arquivos ao criar ou atualizar um File. Para ver informações sobre como criar um File somente de metadados, consulte Criar arquivos.

Há três tipos de upload que você pode fazer:

  • Upload simples (uploadType=media): use esse tipo de upload para transferir um pequeno arquivo de mídia (5 MB ou menos) sem fornecer metadados. Para realizar um upload simples, consulte Fazer um upload simples.

  • Upload de várias partes (uploadType=multipart): use esse tipo de upload para transferir um pequeno arquivo (5 MB ou menos) com metadados que descrevem o arquivo em uma única solicitação. Para executar um upload de várias partes, consulte Fazer um upload de várias partes.

  • Upload retomável (uploadType=resumable): use esse tipo de upload para arquivos grandes (com mais de 5 MB) e quando há uma grande chance de interrupção da rede, como ao criar um arquivo de um app para dispositivos móveis. Eles também são uma boa opção para a maioria dos aplicativos, porque também funcionam para arquivos pequenos a um custo mínimo de uma solicitação HTTP extra por upload. Para executar um upload retomável, consulte Fazer um upload retomável.

As bibliotecas de cliente da API do Google implementam pelo menos um desses tipos de uploads. Consulte a documentação da biblioteca de cliente para ver mais detalhes sobre como usar cada um dos tipos.

Use PATCH x PUT

Como atualização, o verbo HTTP PATCH oferece suporte a uma atualização parcial do recurso de arquivo, enquanto o verbo HTTP PUT oferece suporte à substituição total do recurso. Observe que PUT pode introduzir alterações interruptivas ao adicionar um novo campo a um recurso existente.

Ao fazer upload de um recurso de arquivo, use as seguintes diretrizes:

  • Use o verbo HTTP documentado na referência da API para a solicitação inicial de um upload retomável ou para a única solicitação de um upload simples ou de várias partes.
  • Use PUT para todas as solicitações subsequentes para um upload retomável depois que a solicitação for iniciada. Essas solicitações fazem upload do conteúdo, independentemente do método chamado.

Fazer um upload simples

Para fazer um upload simples, use o método files.create com uploadType=media.

Veja a seguir como fazer um upload simples:

HTTP

  1. Crie uma solicitação POST para o URI /upload do método com o parâmetro de consulta uploadType=media:

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

  2. Adicione os dados do arquivo ao corpo da solicitação.

  3. Adicione estes cabeçalhos HTTP:

    • Content-Type. Defina conforme o tipo de mídia MIME do objeto que está sendo enviado.
    • Content-Length. Defina conforme o número de bytes do upload. Se você usar a codificação de transferência em partes, esse cabeçalho não será necessário.
  4. Envie a solicitação. Se a solicitação for bem-sucedida, o servidor vai retornar o código de status HTTP 200 OK com os metadados do arquivo. {HTTP}

Quando você executa um upload simples, os metadados básicos são criados e alguns atributos são inferidos do arquivo, como o tipo MIME ou o modifiedTime. Você pode usar um upload simples nos casos em que há arquivos pequenos e os metadados do arquivo não são importantes.

Fazer um upload de várias partes

Uma solicitação de upload de várias partes permite fazer upload de metadados e dados na mesma solicitação. Use essa opção se os dados enviados forem pequenos o suficiente para que o upload possa ser refeito inteiramente se a conexão falhar.

Para executar um upload de várias partes, use o método files.create com uploadType=multipart.

Veja a seguir como fazer um upload de várias 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
from __future__ import print_function

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. Crie uma solicitação POST para o URI /upload do método com o parâmetro de consulta uploadType=multipart:

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

  2. Crie o corpo da solicitação. Formate o corpo de acordo com o tipo de conteúdo relacionado a várias partes [RFC 2387], que contém duas partes:

    • Metadados. Os metadados precisam vir primeiro e ter um cabeçalho Content-Type definido como application/json; charset=UTF-8. Adicione os metadados do arquivo no formato JSON.
    • Mídia. A mídia precisa vir depois e ter um cabeçalho Content-Type de qualquer tipo MIME. Adicione os dados do arquivo à parte de mídia.

    Identifique cada parte com uma string limite, precedida por dois hifens. Além disso, adicione dois hifens após a string do limite final.

  3. Adicione estes cabeçalhos HTTP de nível superior:

    • Content-Type. Defina como multipart/related e inclua a string de limite que você está usando para identificar as diferentes partes da solicitação. Por exemplo: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length. Defina com o número total de bytes no corpo da solicitação.
  4. Envie a solicitação.

Para criar ou atualizar somente a parte de metadados, sem os dados associados, envie uma solicitação POST ou PATCH para o endpoint de recurso padrão: https://www.googleapis.com/drive/v3/files Se a solicitação for bem-sucedida, o servidor retornará o código de status HTTP 200 OK com os metadados do arquivo.

Ao criar arquivos, eles precisam especificar uma extensão de arquivo no campo name do arquivo. Por exemplo, ao criar um arquivo JPEG de fotos, você pode especificar algo como "name": "photo.jpg" nos metadados. As chamadas subsequentes para files.get retornam a propriedade fileExtension somente leitura que contém a extensão especificada originalmente no campo name.

Executar um upload retomável

Um upload retomável permite retomar uma operação de upload depois que uma falha de comunicação interrompe o fluxo de dados. Como não é necessário reiniciar os uploads de arquivos grandes desde o início, os uploads retomáveis também podem reduzir o uso da largura de banda em caso de falha de rede.

Os uploads retomáveis são úteis quando os tamanhos dos arquivos podem variar muito ou quando há um limite de tempo fixo para solicitações (como tarefas em segundo plano do SO para dispositivos móveis e determinadas solicitações do App Engine). Você também pode usar uploads retomáveis para situações em que você quer mostrar uma barra de progresso do upload.

Um upload retomável consiste em várias etapas de alto nível:

  1. Envie a solicitação inicial e recupere o URI da sessão retomável.
  2. Faça upload dos dados e monitore o estado de upload.
  3. (Opcional) Se o upload for interrompido, retome o upload.

Enviar a solicitação inicial

Para iniciar um upload retomável, use o método files.create com uploadType=resumable.

HTTP

  1. Crie uma solicitação POST para o URI /upload do método com o parâmetro de consulta uploadType=resumable:

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

    Se a solicitação de início for bem-sucedida, a resposta incluirá um código de status HTTP 200 OK. Além disso, ele inclui um cabeçalho Location que especifica o URI da sessão retomável:

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

    Salve o URI de sessão retomável para fazer upload dos dados do arquivo e consultar o status do upload. Um URI de sessão retomável expira após uma semana.

  2. Se você tiver metadados para o arquivo, adicione-os ao corpo da solicitação no formato JSON. Caso contrário, deixe o corpo em branco.

  3. Adicione estes cabeçalhos HTTP:

    • X-Upload-Content-Type: opcional. Defina como o tipo MIME dos dados de arquivo, que serão transferido nas solicitações subsequentes. Se o tipo MIME dos dados não for especificado nos metadados ou por esse cabeçalho, o objeto será exibido como application/octet-stream.
    • X-Upload-Content-Length: opcional. Defina como o número de bytes dos dados do arquivo, que são transferidos nas solicitações subsequentes.
    • Content-Type: obrigatório se você tiver os metadados do arquivo. Defina como application/json; charset=UTF-8.
    • Content-Length. Obrigatório, a menos que você use a codificação de transferência em partes. Defina como o número de bytes no corpo dessa solicitação inicial.
  4. Envie a solicitação. Se a solicitação de início da sessão for bem-sucedida, a resposta incluirá um código de status 200 OK HTTP. Além disso, a resposta inclui um cabeçalho Location que especifica o URI da sessão retomável. Use o URI de sessão retomável para fazer upload dos dados do arquivo e consultar o status do upload. Um URI de sessão retomável expira após uma semana.

  5. Copie e salve o URL da sessão retomável.

  6. Prossiga para Fazer upload do conteúdo.

Fazer upload do conteúdo

Há duas maneiras de fazer upload de um arquivo com uma sessão retomável:

  • Faça o upload do conteúdo em uma única solicitação: use essa abordagem quando o arquivo pode ser enviado em uma solicitação, se não houver limite de tempo fixo para uma única solicitação ou se você não precisar exibir um indicador de progresso do upload. Essa abordagem é melhor porque requer menos solicitações e resulta em um melhor desempenho.
  • Fazer upload do conteúdo em vários blocos: use essa abordagem se você precisar reduzir a quantidade de dados transferidos em uma única solicitação. Talvez seja necessário reduzir os dados transferidos quando houver um limite de tempo fixo para solicitações individuais, como ocorre com determinadas classes de solicitações do App Engine. Essa abordagem também é útil se você precisar fornecer um indicador personalizado para mostrar o progresso do upload.

HTTP: solicitação única

  1. Crie uma solicitação PUT para o URI da sessão retomável.
  2. Adicione os dados do arquivo ao corpo da solicitação.
  3. Adicione um cabeçalho HTTP Content-Length, definido como o número de bytes no arquivo.
  4. Envie a solicitação. Se a solicitação de upload for interrompida ou se você receber uma resposta 5xx, siga o procedimento em Retomar um upload interrompido.

HTTP: várias solicitações

  1. Crie uma solicitação PUT para o URI da sessão retomável.

  2. Adicione os dados de cada parte ao corpo da solicitação. Crie partes em múltiplos de 256 KB (256 x 1.024 bytes), exceto a parte final que conclui o upload. Mantenha o tamanho do bloco o maior possível para que o upload seja eficiente.

  3. Adicione estes cabeçalhos HTTP:

    • Content-Length: defina como o número de bytes na parte atual.
    • Content-Range. Defina para mostrar de quais bytes no arquivo você faz upload. Por exemplo, Content-Range: bytes 0-524287/2000000 mostra que você faz upload dos primeiros 524.288 bytes (256 x 1.024 x 2) em um arquivo de 2 milhões de bytes.
  4. Envie a solicitação e processe a resposta. Se a solicitação de upload for interrompida ou se você receber uma resposta 5xx, siga o procedimento em Retomar um upload interrompido.

  5. Repita as etapas de 1 a 4 para cada fragmento que permanece no arquivo. Use o cabeçalho Range na resposta para determinar onde iniciar a próxima parte. Não suponha que o servidor recebeu todos os bytes enviados na solicitação anterior.

Quando o upload do arquivo inteiro for concluído, você receberá uma resposta 200 OK ou 201 Created, além de todos os metadados associados ao recurso.

Retomar um upload interrompido

Se uma solicitação de upload for encerrada antes de uma resposta ou se você receber uma resposta 503 Service Unavailable, será necessário retomar o upload interrompido.

HTTP

  1. Para saber o status do upload, crie uma solicitação PUT vazia para o URI de sessão retomável.

  2. Adicione um cabeçalho Content-Range para indicar que a posição atual no arquivo é desconhecida. Por exemplo, defina Content-Range como */2000000 se o tamanho total do arquivo for de 2.000.000 bytes. Se você não souber o tamanho total do arquivo, defina Content-Range como */*.

  3. Envie a solicitação.

  4. Processe a resposta:

    • Uma resposta 200 OK ou 201 Created indica que o upload foi concluído e não é necessário realizar qualquer outra ação.
    • Uma resposta 308 Resume Incomplete indica que você precisa continuar o upload do arquivo.
    • Uma resposta 404 Not Found indica que a sessão de upload expirou e que o upload precisa ser reiniciado desde o início.
  5. Se você recebeu uma resposta 308 Resume Incomplete, processe o cabeçalho Range da resposta para determinar quais bytes o servidor recebeu. Se a resposta não tiver um cabeçalho Range, nenhum byte foi recebido. Por exemplo, um cabeçalho Range de bytes=0-42 indica que os primeiros 43 bytes do arquivo foram recebidos e que o próximo fragmento para fazer upload começaria com o byte 44.

  6. Agora que você sabe onde retomar o upload, continue fazendo upload do arquivo começando pelo byte seguinte. Inclua um cabeçalho Content-Range para indicar qual parte do arquivo é enviada. Por exemplo, Content-Range: bytes 43-1999999 indica que você envia os bytes 44 a 2.000.000.

Solucionar erros de upload de mídia

Ao fazer upload de mídia, siga estas práticas recomendadas para corrigir erros:

  • Para erros 5xx, retome ou repita os uploads que falharem devido a interrupções de conexão. Para mais informações sobre como lidar com erros 5xx, consulte Resolver um erro 5xx.
  • Para erros 403 rate limit, tente fazer upload novamente. Para mais informações sobre como lidar com erros 403 rate limit, consulte Resolver um 403 error: Rate limit exceeded.
  • Se houver erros 4xx (incluindo 403) durante um upload retomável, reinicie o upload. Esses erros indicam que a sessão de upload expirou e precisa ser reiniciada solicitando um novo URI de sessão. As sessões de upload também expiram após uma semana de inatividade.

Importar para os tipos do Documentos Google

Ao criar um arquivo no Drive, é possível convertê-lo em um tipo de arquivo do Google Workspace, como um arquivo do Documentos ou Planilhas Google. Por exemplo, talvez você queira converter um documento do processador de texto favorito em um arquivo do Documentos Google para aproveitar os recursos dele.

Para converter um arquivo em um tipo de arquivo específico do Google Workspace, defina o mimeType do Google Workspace ao criá-lo.

Veja a seguir como converter um arquivo CSV em uma planilha do 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
from __future__ import print_function

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

Para ver se uma conversão está disponível, verifique a matriz importFormats do recurso Sobre antes de criar o arquivo. As conversões compatíveis estão disponíveis dinamicamente nessa matriz. Alguns formatos de importação comuns são:

DePara
Microsoft Word, OpenDocument Text, HTML, RTF, texto simplesDocumentos Google
Microsoft Excel, planilha OpenDocument, CSV, TSV, texto simplesPlanilhas Google
Microsoft PowerPoint, apresentação do OpenDocumentApresentações Google
JPEG, PNG, GIF, BMP, PDFDocumentos Google (incorpora a imagem a um arquivo)
Texto simples (tipo MIME especial), JSONGoogle Apps Script

Quando você faz upload e converte mídia durante uma solicitação de update em um documento, uma planilha ou uma apresentação, todo o conteúdo do documento é substituído.

Quando você converte uma imagem em um Documento Google, o Drive usa o reconhecimento óptico de caracteres (OCR) para converter a imagem em texto. É possível melhorar a qualidade do algoritmo OCR especificando o código de idioma BCP 47 aplicável no parâmetro ocrLanguage. O texto extraído é exibido no documento com a imagem incorporada.

Usar um ID pré-gerado para fazer upload de arquivos

A API Drive permite recuperar uma lista de IDs de arquivos pré-gerados que são usados para fazer upload e criar recursos. As solicitações de upload e criação de arquivos podem usar esses IDs pré-gerados. Defina o campo id nos metadados do arquivo.

Para criar IDs pré-gerados, chame file.generateIds com o número de IDs a serem criados.

É possível repetir os uploads com segurança com IDs pré-gerados se houver um erro ou tempo limite indeterminado do servidor. Se o arquivo tiver sido criado corretamente, as novas tentativas retornarão um erro HTTP 409 e não criarão arquivos duplicados.

Definir texto indexável para tipos de arquivo desconhecidos

Os usuários podem usar a IU do Drive para pesquisar o conteúdo de documentos. Você também pode usar files.list e o campo fullText para pesquisar conteúdos do seu app. Para mais informações, consulte Pesquisar arquivos e pastas.

O Drive indexa documentos automaticamente para pesquisa quando reconhece o tipo de arquivo, incluindo documentos de texto, PDFs, imagens com texto e outros tipos comuns. Se o app salvar outros tipos de arquivo (como desenhos, vídeos e atalhos), será possível melhorar a possibilidade de descoberta fornecendo texto indexável no campo contentHints.indexableText do arquivo.

Para mais informações sobre texto indexável, consulte Gerenciar metadados de arquivos.