Prześlij dane pliku

Interfejs Google Drive API umożliwia przesyłanie danych plików podczas tworzenia lub aktualizowania File. Aby dowiedzieć się, jak utworzyć plik zawierający tylko metadane, np. folder, przeczytaj artykuł Tworzenie plików zawierających tylko metadane.

Istnieją 3 rodzaje przesyłania:

  • Proste przesyłanie (uploadType=media): ten typ przesyłania służy do przesyłania niewielkich plików multimedialnych (maksymalnie 5 MB) bez konieczności dostarczania metadanych. Informacje o prostym przesyłaniu znajdziesz w artykule Przesyłanie prostego pliku.

  • Przesyłanie wieloczęściowe (uploadType=multipart): „za pomocą tego typu przesyłania możesz przesłać w jednym żądaniu niewielki plik (do 5 MB) wraz z metadanymi opisującymi go. Aby dowiedzieć się, jak przesyłać wiele części, przeczytaj artykuł Przesyłanie wieloczęściowe.

  • Wznawianie przesyłania (uploadType=resumable): tego typu przesyłania używaj w przypadku dużych plików (większych niż 5 MB) i gdy występuje wysokie ryzyko przerw w działaniu sieci, np. podczas tworzenia pliku z aplikacji mobilnej. W przypadku większości aplikacji dobrym rozwiązaniem jest też przesyłanie z możliwością wznowienia, ponieważ takie rozwiązanie sprawdza się też w przypadku małych plików przy minimalnym koszcie 1 dodatkowego żądania HTTP na przesłanie. Aby dowiedzieć się, jak wznowić przesyłanie, przeczytaj sekcję Przesyłanie z możliwością wznowienia.

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

Używaj strategii PATCH i PUT

Dla przypomnienia: czasownik HTTP PATCH obsługuje częściową aktualizację zasobów plików, natomiast czasownik HTTP PUT obsługuje pełne zastępowanie zasobów. Pamiętaj, że PUT może wprowadzić zmiany powodujące niezgodność podczas dodawania nowego pola do istniejącego zasobu.

Podczas przesyłania zasobu związanego z plikiem postępuj zgodnie z tymi wskazówkami:

  • Używaj czasowników HTTP opisanych w dokumentacji API w przypadku początkowego żądania przesyłania możliwego do wznowienia lub jedynego żądania prostego lub wieloczęściowego przesyłania.
  • Używaj PUT w przypadku wszystkich kolejnych żądań wznowienia przesyłania po ich rozpoczęciu. Żądania te przesyłają treści niezależnie od wywoływania metody.

Proste przesyłanie

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

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

HTTP

  1. Utwórz żą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 typ multimediów MIME przesyłanego obiektu.
    • Content-Length. Ustaw liczbę przesyłanych bajtów. Jeśli używasz fragmentowego kodowania transferu, ten nagłówek nie jest wymagany.
  4. Wyślij prośbę. Jeśli żądanie zostanie zrealizowane, serwer zwraca kod stanu HTTP 200 OK wraz z metadanymi pliku. {HTTP}

Gdy wykonujesz proste przesyłanie, tworzone są podstawowe metadane, a niektóre atrybuty są pobierane z pliku, takie jak typ MIME czy modifiedTime. Możesz użyć prostego przesyłania w sytuacjach, gdy masz małe pliki, a metadane plików nie są ważne.

Przesyłanie wieloczęściowe

Wieloczęściowe żądanie przesyłania 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, by przesłać je ponownie w całości w przypadku niepowodzenia połączenia.

Aby przesłać wiele części, użyj metody files.create z uploadType=multipart.

Poniżej przedstawiono sposób przesyłania wieloczęściowego:

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. Utwórz żą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 wieloczęściowych/powiązanych RFC 2387, który składa się z 2 części:

    • Metadane Metadane muszą występować na pierwszym miejscu i muszą mieć nagłówek Content-Type ustawiony na application/json; charset=UTF-8. Dodaj metadane pliku w formacie JSON.
    • Multimedia. Plik multimedialny musi być na drugim miejscu i musi mieć nagłówek Content-Type dowolnego typu MIME. Dodaj dane pliku do sekcji multimediów.

    Określ każdą część za pomocą ciągu granicy poprzedzonego 2 łącznikami. Dodatkowo po końcowym ciągu znaków granicznych wstaw 2 łączniki.

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

    • Content-Type. Ustaw wartość multipart/related i dodaj ciąg granicy używany 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 zostanie zrealizowane, serwer zwraca kod stanu HTTP 200 OK wraz z metadanymi pliku.

Podczas tworzenia plików należy określić ich rozszerzenie w polu name. Na przykład podczas tworzenia pliku JPEG zdjęcia możesz w metadanych określić coś takiego jak "name": "photo.jpg". Kolejne wywołania files.get zwracają właściwość fileExtension tylko do odczytu zawierającą rozszerzenie pierwotnie określone w polu name.

Przesyłanie z możliwością wznowienia

Przesyłanie z możliwością wznowienia umożliwia wznowienie operacji przesyłania, gdy błąd komunikacji przerwie przepływ danych. Wznowienie przesyłania dużych plików nie wymaga od razu ponownego rozpoczynania przesyłania, więc w przypadku awarii sieci może to spowodować zmniejszenie wykorzystania przepustowości.

Przesyłanie z możliwością wznowienia jest przydatne, gdy rozmiary plików mogą się znacznie różnić lub gdy istnieje ustalony limit czasu dla żądań (takich jak zadania wykonywane w tle na urządzeniu mobilnym lub określone żądania App Engine). Możesz też użyć funkcji wznawiania przesyłania, gdy chcesz pokazać pasek postępu przesyłania.

Przesyłanie danych, które można wznowić, składa się z kilku głównych czynności:

  1. Wyślij początkowe żądanie i pobierz identyfikator URI sesji możliwej do wznowienia.
  2. Przesyłanie danych i monitorowanie stanu przesyłania.
  3. (Opcjonalnie) Jeśli przesyłanie zostało zakłócone, wznów przesyłanie.

Wyślij początkową prośbę

Aby zainicjować przesyłanie z możliwością wznowienia, użyj metody files.create z uploadType=resumable.

HTTP

  1. Utwórz żą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 inicjowania się powiedzie, odpowiedź będzie zawierać kod stanu HTTP 200 OK. Dodatkowo zawiera nagłówek Location, który określa identyfikator URI sesji możliwej do 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 możliwej do wznowienia, aby móc przesłać dane pliku i zapytać o 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. Opcjonalnie. Ustaw typ MIME danych pliku, które są przesyłane w kolejnych żądaniach. Jeśli typ MIME danych nie jest określony w metadanych ani przez ten nagłówek, obiekt jest udostępniany jako application/octet-stream.
    • X-Upload-Content-Length. Opcjonalnie. Ustaw liczbę bajtów danych plików, które są przesyłane w kolejnych żądaniach.
    • Content-Type. Wymagany, jeśli masz metadane pliku. Ustaw jako application/json; charset=UTF-8.
    • Content-Length. Wymagane, chyba że używasz fragmentów kodowania transferu. Ustaw liczbę bajtów w treści tego początkowego żądania.
  4. Wyślij prośbę. Jeśli żądanie inicjowania sesji zostanie zrealizowane, odpowiedź zawiera kod stanu 200 OK HTTP. Dodatkowo odpowiedź zawiera nagłówek Location, który określa identyfikator URI sesji możliwej do wznowienia. Aby przesłać dane pliku i zapytać o stan przesyłania, użyj identyfikatora URI sesji możliwego do wznowienia. Identyfikator URI sesji z możliwością wznowienia wygasa po tygodniu.

  5. Skopiuj i zapisz adres URL sesji możliwej do wznowienia.

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

Prześlij treści

Plik z sesją, którą można wznowić, można przesłać na 2 sposoby:

  • Prześlij treści w ramach pojedynczego żądania: skorzystaj z tej metody, jeśli plik można przesłać w ramach jednego żądania, jeśli nie ma stałego limitu czasu dla pojedynczego żądania lub nie musisz wyświetlać wskaźnika postępu przesyłania. Ta metoda jest najlepsza, ponieważ wymaga mniejszej liczby żądań i zwiększa wydajność.
  • Prześlij treść w wielu fragmentach: użyj tej metody, jeśli musisz zmniejszyć ilość danych przesyłanych w jednym żądaniu. Gdy istnieje ustalony limit czasu na poszczególne żądania, może być konieczne zmniejszenie ilości przesyłanych danych, jak w przypadku niektórych klas żądań App Engine. Ta metoda jest też przydatna, jeśli musisz zapewnić niestandardowy wskaźnik postępu przesyłania.

HTTP – pojedyncze żądanie

  1. Utwórz żądanie PUT do identyfikatora URI sesji możliwej do 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 przesyłania zostanie przerwane lub otrzymasz odpowiedź 5xx, wykonaj czynności opisane w sekcji Wznawianie przerwanego przesyłania.

HTTP – wiele żądań

  1. Utwórz żądanie PUT do identyfikatora URI sesji możliwej do wznowienia.

  2. Dodaj dane fragmentu do treści żądania. Utwórz fragmenty jako wielokrotności 256 KB (256 x 1024 bajty) z wyjątkiem ostatniego fragmentu, który kończy przesyłanie. Aby przesyłanie było skuteczne, zadbaj o jak największą wielkość fragmentu.

  3. Dodaj te nagłówki HTTP:

    • Content-Length. Ustaw na liczbę bajtów w bieżącym fragmencie.
    • Content-Range. Służy do wyświetlania liczby bajtów w przesłanym pliku. Na przykład Content-Range: bytes 0-524287/2000000 pokazuje, że przesyłasz pierwsze 524 288 bajtów (256 × 1024 × 2) w pliku o wielkości 2 000 000 bajtów.
  4. Wyślij żądanie i przetwórz odpowiedź. Jeśli żądanie przesyłania zostanie przerwane lub otrzymasz odpowiedź 5xx, wykonaj czynności opisane w sekcji Wznawianie przerwanego przesyłania.

  5. Powtarzaj kroki od 1 do 4 w przypadku każdego fragmentu, który pozostaje w pliku. Aby określić, od którego momentu rozpocząć następny fragment, użyj w odpowiedzi nagłówka Range. Nie zakładaj, że serwer otrzymał wszystkie bajty wysłane w poprzednim żądaniu.

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

Wznawianie przerwanego przesyłania

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

HTTP

  1. Aby zażądać stanu przesyłania, utwórz puste żądanie PUT do identyfikatora URI sesji możliwej do wznowienia.

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

  3. Wyślij prośbę.

  4. Przetwarzaj odpowiedź:

    • Odpowiedź 200 OK lub 201 Created oznacza, że przesyłanie zostało zakończone i nie musisz nic więcej robić.
    • Odpowiedź 308 Resume Incomplete oznacza, że musisz kontynuować przesyłanie pliku.
    • Odpowiedź 404 Not Found oznacza, że sesja przesyłania wygasła i trzeba rozpocząć przesyłanie od początku.
  5. Jeśli otrzymano odpowiedź 308 Resume Incomplete, przetwórz jej nagłówek Range, aby określić, jakie bajty odebrał serwer. Jeśli odpowiedź nie ma nagłówka Range, nie otrzymano żadnych bajtów. Na przykład nagłówek Range o wartości bytes=0-42 oznacza, że otrzymano pierwsze 43 bajty pliku i że następny fragment do przesłania rozpoczynałby się od bajtu 44.

  6. Gdy już wiesz, gdzie wznowić przesyłanie, możesz kontynuować przesyłanie pliku, zaczynając od następnego bajtu. Dołącz nagłówek Content-Range, aby wskazać, która część pliku jest wysyłana. Na przykład Content-Range: bytes 43-1999999 oznacza, że wysyłasz bajty od 44 do 2 000 000.

Postępowanie w przypadku błędów przesyłania multimediów

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

  • W przypadku 5xx błędów wznów lub ponów próbę przesyłania, które nie powiedzie się z powodu przerw w połączeniu. Więcej informacji o postępowaniu z błędami 5xx znajdziesz w sekcji dotyczącej błędów 500, 502, 503 i 504.
  • Jeśli wystąpiło 403 rate limit błędów, spróbuj przesłać ponownie. Więcej informacji o postępowaniu z błędami 403 rate limit znajdziesz w sekcji dotyczącej błędu 403:rateLimitExceeded.
  • W przypadku wszelkich błędów 4xx (w tym 403) występujących podczas przesyłania możliwego do wznowienia, uruchom przesyłanie ponownie. Te błędy oznaczają, że sesja przesyłania wygasła i trzeba ją uruchomić ponownie, żądając nowego identyfikatora URI sesji. Sesje przesyłania wygasają również po tygodniu braku aktywności.

Typy importu do Dokumentów Google

Gdy tworzysz plik na Dysku, możesz go przekonwertować na typ pliku Google Workspace, taki jak Dokumenty lub Arkusze Google. Można na przykład przekształcić dokument z ulubionego edytora tekstu w Dokumenty, aby skorzystać z jego funkcji.

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

Poniżej pokazujemy, jak przekonwertować plik 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({
      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;
        }
    }
}

Aby zobaczyć, czy jest dostępna konwersja, przed utworzeniem pliku sprawdź tablicę importFormats zasobu about. Obsługiwane konwersje są dostępne w tej tablicy dynamicznie. Typowe formaty importu:

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

Gdy w ramach żądania update przesyłasz multimedia i konwertujesz je na plik Dokumentów, Arkuszy lub Prezentacji, zastępowana jest pełna zawartość dokumentu.

Gdy konwertujesz obraz na plik Dokumentów, Dysk używa optycznego rozpoznawania znaków (OCR) do konwersji na tekst. Możesz poprawić jakość algorytmu OCR, określając odpowiedni kod języka BCP47 w parametrze ocrLanguage. Wyodrębniony tekst pojawi się w dokumencie obok umieszczonego obrazu.

Używanie wcześniej wygenerowanego identyfikatora do przesyłania plików

Interfejs Drive API umożliwia pobranie listy wstępnie wygenerowanych identyfikatorów plików, które służą do przesyłania i tworzenia zasobów. W prośbach o przesłanie i utworzenie pliku można wykorzystać te wstępnie wygenerowane identyfikatory. Ustaw pole id w metadanych pliku.

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

Jeśli wystąpi nieokreślony błąd serwera lub przekroczono czas oczekiwania, możesz bezpiecznie przesłać treści ponownie przy użyciu wstępnie wygenerowanych identyfikatorów. Jeśli plik został utworzony, kolejne próby zwracają błąd HTTP 409 i nie tworzą duplikatów plików.

Zdefiniuj indeksowalny tekst dla nieznanych typów plików

Użytkownicy mogą znajdować treść dokumentów w interfejsie Dysku. Do wyszukiwania zawartości aplikacji możesz też używać files.list i pola fullText. 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 Twoja aplikacja zapisuje inne typy plików (np. rysunki, filmy i skróty), możesz poprawić wykrywalność, podając tekst z możliwością indeksowania w polu contentHints.indexableText pliku.

Więcej informacji o tekście umożliwiającym indeksowanie znajdziesz w artykule Zarządzanie metadanymi plików.