Prześlij dane pliku

Interfejs Google Drive API umożliwia przesyłanie danych pliku podczas tworzenia lub aktualizowania File. Informacje o tym, jak utworzyć plik zawierający tylko metadane, np. folder, znajdziesz w artykule Tworzenie plików zawierających tylko metadane.

Możesz przeprowadzić 3 rodzaje przesyłania:

  • Proste przesyłanie (uploadType=media): użyj tego typu przesyłania, aby przenieść mały plik multimedialny (o rozmiarze nie większym niż 5 MB) bez podawania metadanych. Aby wykonać proste przesyłanie, zapoznaj się z artykułem Wykonywanie prostego przesyłania.

  • Przesyłanie wieloczęściowe (uploadType=multipart): „Użyj tego typu przesyłania, aby przesłać mały plik (o rozmiarze do 5 MB) wraz z metadanymi opisującymi plik w ramach jednego żądania. Aby wykonać przesyłanie wieloczęściowe, zapoznaj się z artykułem Przeprowadzanie przesyłania wieloczęściowego.

  • Wznawialne przesyłanie (uploadType=resumable): używaj tego typu przesyłania w przypadku dużych plików (powyżej 5 MB) oraz gdy istnieje duże prawdopodobieństwo przerwania połączenia sieciowego, np. podczas tworzenia pliku w aplikacji mobilnej. Wznawialne przesyłanie jest też dobrym wyborem w przypadku większości aplikacji, ponieważ działa również w przypadku małych plików przy minimalnym koszcie jednego dodatkowego żądania HTTP na przesyłanie. Aby przeprowadzić przesyłanie z możliwością wznowienia, przeczytaj artykuł Przeprowadzanie przesyłania z możliwością wznowienia.

Biblioteki klienta interfejsu API Google implementują co najmniej jeden z tych typów przesyłania. Więcej informacji o korzystaniu z poszczególnych typów znajdziesz w dokumentacji biblioteki klienta.

Używanie PATCHPUT

Przypomnijmy, że czasownik HTTP PATCH obsługuje częściową aktualizację zasobu pliku, a czasownik HTTP PUT obsługuje pełną wymianę zasobu. Pamiętaj, że PUT może wprowadzać zmiany powodujące niezgodność wsteczną podczas dodawania nowego pola do istniejącego zasobu.

Podczas przesyłania zasobu pliku postępuj zgodnie z tymi wytycznymi:

  • W przypadku początkowego żądania przesyłania z możliwością wznowienia lub jedynego żądania przesyłania prostego lub wieloczęściowego użyj czasownika HTTP udokumentowanego w dokumentacji interfejsu API.
  • Używaj PUT we wszystkich kolejnych żądaniach przesyłania z możliwością wznowienia po rozpoczęciu żądania. Te żądania przesyłają treści niezależnie od wywoływanej metody.

Przeprowadzanie prostego przesyłania

Aby wykonać proste przesyłanie, użyj metody files.create z parametrem uploadType=media.

Poniżej pokazujemy, jak wykonać proste przesyłanie:

HTTP

  1. Wyślij żądanie POST do identyfikatora URI /upload metody z parametrem zapytania uploadType=media:

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

  2. Dodaj dane pliku do treści żądania.

  3. Dodaj te nagłówki HTTP:

    • Content-Type. Ustaw na typ MIME przesyłanego obiektu.
    • Content-Length. Ustaw na liczbę przesyłanych bajtów. Jeśli używasz kodowania przesyłania fragmentami, ten nagłówek nie jest wymagany.
  4. Wyślij prośbę. Jeśli żądanie zakończy się powodzeniem, serwer zwróci kod stanu HTTP 200 OK wraz z metadanymi pliku. {HTTP}

Podczas prostego przesyłania tworzone są podstawowe metadane, a niektóre atrybuty są wywnioskowane z pliku, np. typ MIME lub modifiedTime. Prostego przesyłania możesz używać w przypadku małych plików, gdy metadane plików nie są ważne.

Przeprowadzanie przesyłania wieloczęściowego

Żądanie przesyłania wieloczęściowego umożliwia przesyłanie metadanych i danych w ramach tego samego żądania. Użyj tej opcji, jeśli wysyłane dane są wystarczająco małe, aby w razie niepowodzenia połączenia można było je ponownie przesłać w całości.

Aby wykonać przesyłanie wieloczęściowe, użyj metody files.create z parametrem uploadType=multipart.

Poniżej pokazujemy, jak wykonać przesyłanie wieloczęściowe:

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
<?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. Wyślij żądanie POST do identyfikatora URI /upload metody z parametrem zapytania uploadType=multipart:

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

  2. Utwórz treść żądania. Sformatuj treść zgodnie z typem treści multipart/related RFC 2387, który zawiera 2 części:

    • Metadane Metadane muszą być na początku i muszą mieć nagłówek ustawiony na application/json; charset=UTF-8.Content-Type Dodaj metadane pliku w formacie JSON.
    • Multimedia. Media muszą być na drugim miejscu i muszą mieć nagłówek Content-Type dowolnego typu MIME. Dodaj dane pliku do części dotyczącej mediów.

    Każdą część oznacz ciągiem ograniczającym poprzedzonym dwoma łącznikami. Dodatkowo po ostatnim ciągu znaków granicznych dodaj 2 łączniki.

  3. Dodaj te nagłówki HTTP najwyższego poziomu:

    • Content-Type. Ustaw wartość multipart/related i uwzględnij ciąg znaków granicznych, którego używasz do identyfikowania różnych części żądania. Przykład: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length. Ustaw na łączną liczbę bajtów w treści żądania.
  4. Wyślij prośbę.

Aby utworzyć lub zaktualizować tylko część metadanych bez powiązanych danych, wyślij żądanie POST lub PATCH do standardowego punktu końcowego zasobu:https://www.googleapis.com/drive/v3/files Jeśli żądanie się powiedzie, serwer zwróci kod stanu HTTP 200 OK wraz z metadanymi pliku.

Podczas tworzenia plików powinni oni określić rozszerzenie pliku w name. Na przykład podczas tworzenia pliku JPEG ze zdjęciem możesz w metadanych określić coś takiego: "name": "photo.jpg". Kolejne wywołania funkcji files.get zwracają właściwość fileExtension tylko do odczytu, która zawiera rozszerzenie pierwotnie określone w polu name.

Przeprowadzanie przesyłania z możliwością wznowienia

Przesyłanie z możliwością wznowienia pozwala wznowić operację przesyłania po przerwaniu przepływu danych z powodu błędu komunikacji. Nie musisz ponownie przesyłać dużych plików od początku, więc wznawialne przesyłanie może też zmniejszyć zużycie przepustowości w przypadku awarii sieci.

Wznawialne przesyłanie jest przydatne, gdy rozmiary plików mogą się znacznie różnić lub gdy istnieje stały limit czasu dla żądań (np. w przypadku zadań w tle w mobilnych systemach operacyjnych i niektórych żądań App Engine). Przesyłanie możliwe do wznowienia możesz też stosować w sytuacjach, w których chcesz wyświetlać pasek postępu przesyłania.

Przesyłanie z możliwością wznowienia składa się z kilku etapów:

  1. Wyślij pierwsze żądanie i pobierz identyfikator URI sesji z możliwością wznowienia.
  2. Prześlij dane i monitoruj stan przesyłania.
  3. (opcjonalnie) Jeśli przesyłanie zostanie przerwane, wznow je.

Wysyłanie wstępnej prośby

Aby rozpocząć przesyłanie możliwe do wznowienia, użyj metody files.create z parametrem uploadType=resumable.

HTTP

  1. Wyślij żądanie POST do identyfikatora URI /upload metody z parametrem zapytania uploadType=resumable:

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

    Jeśli żądanie inicjujące zakończy się powodzeniem, odpowiedź będzie zawierać kod stanu HTTP 200 OK. Dodatkowo zawiera nagłówek Location, który określa identyfikator URI sesji z możliwością wznowienia:

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

    Zapisz identyfikator URI sesji z możliwością wznowienia, aby móc przesyłać dane pliku i sprawdzać stan przesyłania. Identyfikator URI sesji z możliwością wznowienia wygasa po tygodniu.

  2. Jeśli masz metadane pliku, dodaj je do treści żądania w formacie JSON. W przeciwnym razie pozostaw treść żądania pustą.

  3. Dodaj te nagłówki HTTP:

    • X-Upload-Content-Type. Opcjonalne. Ustaw na typ MIME danych pliku, które są przesyłane w kolejnych żądaniach. Jeśli typ MIME danych nie jest określony w metadanych lub w tym nagłówku, obiekt jest wyświetlany jako application/octet-stream..
    • X-Upload-Content-Length. Opcjonalne. Ustaw na liczbę bajtów danych pliku, które są przesyłane w kolejnych żądaniach.
    • Content-Type. Wymagane, jeśli masz metadane pliku. Ustaw na application/json; charset=UTF-8.
    • Content-Length. Wymagane, chyba że używasz kodowania przesyłania fragmentami. Ustawiona na liczbę bajtów w treści tego początkowego żądania.
  4. Wyślij prośbę. Jeśli żądanie rozpoczęcia sesji się powiedzie, odpowiedź będzie zawierać kod stanu 200 OK HTTP. Dodatkowo odpowiedź zawiera nagłówek Location, który określa identyfikator URI sesji z możliwością wznowienia. Użyj identyfikatora URI sesji z możliwością wznowienia, aby przesłać dane pliku i sprawdzić stan przesyłania. Identyfikator URI sesji z możliwością wznowienia wygasa po tygodniu.

  5. Skopiuj i zapisz adres URL sesji z możliwością wznowienia.

  6. Przejdź do sekcji Przesyłanie treści.

Prześlij treść

Plik można przesłać w sesji możliwej do wznowienia na 2 sposoby:

  • Przesyłanie treści w ramach jednego żądania: użyj tego podejścia, jeśli plik można przesłać w ramach jednego żądania, nie ma stałego limitu czasu dla żadnego żądania lub nie musisz wyświetlać wskaźnika postępu przesyłania. To podejście jest najlepsze, ponieważ wymaga mniejszej liczby żądań i zapewnia lepszą wydajność.
  • Przesyłanie treści w kilku częściach: użyj tej metody, jeśli musisz zmniejszyć ilość danych przesyłanych w ramach jednego żądania. Może być konieczne zmniejszenie ilości przesyłanych danych, gdy poszczególne żądania mają stały limit czasu, jak to może mieć miejsce w przypadku niektórych klas żądań App Engine. To podejście jest też przydatne, jeśli musisz podać niestandardowy wskaźnik, który będzie pokazywać postęp przesyłania.

HTTP – pojedyncze żądanie

  1. Wyślij żądanie PUT do identyfikatora URI sesji z możliwością wznowienia.
  2. Dodaj dane pliku do treści żądania.
  3. Dodaj nagłówek HTTP Content-Length ustawiony na liczbę bajtów w pliku.
  4. Wyślij prośbę. Jeśli żądanie przesłania zostanie przerwane lub otrzymasz odpowiedź 5xx, postępuj zgodnie z procedurą opisaną w sekcji Wznawianie przerwanego przesyłania.

HTTP – wiele żądań

  1. Wyślij żądanie PUT do identyfikatora URI sesji z możliwością wznowienia.

  2. Dodaj dane fragmentu do treści żądania. Twórz części o rozmiarze będącym wielokrotnością 256 KB (256 x 1024 bajtów), z wyjątkiem ostatniej części, która kończy przesyłanie. Utrzymuj jak największy rozmiar fragmentu, aby przesyłanie było wydajne.

  3. Dodaj te nagłówki HTTP:

    • Content-Length. Ustaw na liczbę bajtów w bieżącym bloku.
    • Content-Range. Ustaw, które bajty w przesyłanym pliku mają być widoczne. Na przykład Content-Range: bytes 0-524287/2000000 oznacza, że przesyłasz pierwsze 524 288 bajtów (256 x 1024 x 2) w pliku o rozmiarze 2 000 000 bajtów.
  4. Wyślij żądanie i przetwórz odpowiedź. Jeśli żądanie przesłania zostanie przerwane lub otrzymasz odpowiedź 5xx, postępuj zgodnie z procedurą opisaną w sekcji Wznawianie przerwanego przesyłania.

  5. Powtórz kroki od 1 do 4 dla każdego fragmentu, który pozostał w pliku. Użyj nagłówka Range w odpowiedzi, aby określić, od którego miejsca zacząć następny fragment. Nie zakładaj, że serwer otrzymał wszystkie bajty wysłane w poprzednim żądaniu.

Po zakończeniu przesyłania całego pliku otrzymasz odpowiedź 200 OK lub 201 Created wraz z metadanymi powiązanymi z zasobem.

Wznawianie przerwanego przesyłania

Jeśli żądanie przesłania zostanie zakończone przed otrzymaniem odpowiedzi lub jeśli otrzymasz odpowiedź 503 Service Unavailable, musisz wznowić przerwane przesyłanie.

HTTP

  1. Aby poprosić o stan przesyłania, wyślij puste żądanie PUT do identyfikatora URI sesji z możliwością wznowienia.

  2. Dodaj nagłówek Content-Range, aby wskazać, że bieżąca pozycja w pliku jest nieznana. Jeśli np. łączna długość pliku wynosi 2 000 000 bajtów, ustaw wartość Content-Range na */2000000. Jeśli nie znasz pełnego rozmiaru pliku, ustaw Content-Range na */*.

  3. Wyślij prośbę.

  4. Przetwórz odpowiedź:

    • Odpowiedź 200 OK lub 201 Created oznacza, że przesyłanie zostało zakończone i nie trzeba podejmować żadnych dodatkowych działań.
    • Odpowiedź 308 Resume Incomplete oznacza, że musisz kontynuować przesyłanie pliku.
    • Odpowiedź 404 Not Found oznacza, że sesja przesyłania wygasła i trzeba ją rozpocząć od nowa.
  5. Jeśli otrzymasz odpowiedź 308 Resume Incomplete, przetwórz nagłówek Range odpowiedzi, aby określić, które bajty zostały odebrane przez serwer. Jeśli w odpowiedzi nie ma nagłówka Range, nie otrzymano żadnych bajtów. Na przykład nagłówek Rangebytes=0-42 oznacza, że pierwsze 43 bajty pliku zostały odebrane, a następny fragment do przesłania zacznie się od bajtu 44.

  6. Gdy wiesz już, od którego miejsca wznowić przesyłanie, kontynuuj przesyłanie pliku od następnego bajtu. Dodaj nagłówek Content-Range, aby wskazać, którą część pliku wysyłasz. Na przykład Content-Range: bytes 43-1999999 oznacza, że wysyłasz bajty od 44 do 2 000 000.

Obsługa błędów przesyłania multimediów

Podczas przesyłania multimediów postępuj zgodnie z tymi sprawdzonymi metodami, aby uniknąć błędów:

  • W przypadku błędów 5xx wznów lub ponów przesyłanie, które nie powiodło się z powodu przerw w połączeniu. Więcej informacji o obsłudze błędów 5xx znajdziesz w artykule Błędy 500, 502, 503 i 504.
  • W przypadku błędów 403 rate limit spróbuj ponownie przesłać plik. Więcej informacji o obsłudze błędów 403 rate limit znajdziesz w artykule Błąd 403:rateLimitExceeded.
  • W przypadku błędów 4xx (w tym 403) podczas przesyłania z możliwością wznowienia uruchom przesyłanie ponownie. Te błędy wskazują, że sesja przesyłania wygasła i należy ją ponownie uruchomić, wysyłając prośbę o nowy identyfikator URI sesji. Sesje przesyłania wygasają po tygodniu nieaktywności.

Typy importowania do Dokumentów Google

Gdy utworzysz plik na Dysku, możesz przekonwertować go na typ pliku Google Workspace, np. Dokumenty lub Arkusze Google. Możesz na przykład przekonwertować dokument z ulubionego edytora tekstu na Dokument Google, aby skorzystać z jego funkcji.

Aby przekonwertować plik na określony typ pliku Google Workspace, podczas tworzenia pliku określ mimeType Google Workspace.

Poniżej znajdziesz instrukcje konwertowania pliku CSV na arkusz 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
<?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;
        }
    }
}

Aby sprawdzić, czy konwersja jest dostępna, przed utworzeniem pliku sprawdź tablicę importFormats zasobu about. Obsługiwane konwersje są dostępne dynamicznie w tej tablicy. Oto kilka popularnych formatów importu:

OdDo
Microsoft Word, OpenDocument Text, HTML, RTF, zwykły tekstDokumenty Google
Microsoft Excel, arkusz kalkulacyjny OpenDocument, CSV, TSV, zwykły tekstArkusze Google
Microsoft PowerPoint, Prezentacja OpenDocumentPrezentacje Google
JPEG, PNG, GIF, BMP, PDFDokumenty Google (obraz jest umieszczany w dokumencie)
Zwykły tekst (specjalny typ MIME), JSONGoogle Apps Script

Gdy przesyłasz i konwertujesz multimedia podczas update żądania pliku Dokumentów, Arkuszy lub Prezentacji, cała zawartość dokumentu zostaje zastąpiona.

Gdy konwertujesz obraz na Dokument, Dysk używa optycznego rozpoznawania znaków (OCR), aby przekształcić obraz w tekst. Jakość algorytmu OCR możesz poprawić, podając odpowiedni kod języka BCP 47 w parametrze ocrLanguage. Wyodrębniony tekst pojawi się w dokumencie obok osadzonego obrazu.

Przesyłanie plików za pomocą wygenerowanego wcześniej identyfikatora

Interfejs Drive API umożliwia pobieranie listy wstępnie wygenerowanych identyfikatorów plików, które są używane do przesyłania i tworzenia zasobów. Żądania przesyłania i tworzenia plików mogą korzystać z tych wstępnie wygenerowanych identyfikatorów. Ustaw pole id w metadanych pliku.

Aby utworzyć wstępnie wygenerowane identyfikatory, wywołaj funkcję files.generateIds z liczbą identyfikatorów do utworzenia.

Możesz bezpiecznie ponawiać przesyłanie z wcześniej wygenerowanymi identyfikatorami, jeśli wystąpi nieokreślony błąd serwera lub przekroczenie limitu czasu. Jeśli plik został utworzony, kolejne próby zwracają błąd HTTP 409 i nie powodują utworzenia duplikatów.

Określanie tekstu indeksowalnego w przypadku nieznanych typów plików

Użytkownicy mogą wyszukiwać zawartość dokumentu za pomocą interfejsu Dysku. Możesz też użyć files.list i pola fullText, aby wyszukać treści z aplikacji. Więcej informacji znajdziesz w artykule Wyszukiwanie plików i folderów.

Dysk automatycznie indeksuje dokumenty na potrzeby wyszukiwania, gdy rozpoznaje typ pliku, w tym dokumenty tekstowe, pliki PDF, obrazy z tekstem i inne popularne typy. Jeśli aplikacja zapisuje inne typy plików (np. rysunki, filmy i skróty), możesz zwiększyć ich wykrywalność, podając tekst indeksowany w polu contentHints.indexableText pliku.

Więcej informacji o tekście, który można indeksować, znajdziesz w artykule Zarządzanie metadanymi plików.