Загрузить данные файла

API Google Drive позволяет загружать данные при создании или обновлении File . Сведения о создании файла, содержащего только метаданные, например, папки, см. в разделе Создание файлов, содержащих только метаданные .

Вы можете выполнить три типа загрузки:

  • Простая загрузка ( uploadType=media ) : используйте этот тип загрузки для передачи небольшого медиафайла (5 МБ или меньше) без предоставления метаданных. Чтобы выполнить простую загрузку, см. раздел Выполнение простой загрузки .

  • Многокомпонентная загрузка ( uploadType=multipart ) : «Используйте этот тип загрузки для передачи небольшого файла (5 МБ или меньше) вместе с метаданными, описывающими файл, в одном запросе. Чтобы выполнить многокомпонентную загрузку, см. раздел Выполнение многокомпонентной загрузки ».

  • Возобновляемая загрузка ( uploadType=resumable ) : используйте этот тип загрузки для больших файлов (более 5 МБ) и при высокой вероятности сбоя сети, например, при создании файла в мобильном приложении. Возобновляемая загрузка также подходит для большинства приложений, поскольку она работает и с небольшими файлами при минимальных затратах в один дополнительный HTTP-запрос на загрузку. Чтобы выполнить возобновляемую загрузку, см. раздел Выполнение возобновляемой загрузки .

Клиентские библиотеки API Google реализуют как минимум один из этих типов загрузки. Подробнее об использовании каждого типа см. в документации клиентской библиотеки.

Используйте PATCH вместо PUT

Напоминаем, что HTTP-команда PATCH поддерживает частичное обновление ресурсов файла, тогда как HTTP-команда PUT поддерживает полную замену ресурсов. Обратите внимание, что PUT может внести критические изменения при добавлении нового поля в существующий ресурс.

При загрузке файлового ресурса придерживайтесь следующих рекомендаций:

  • Используйте HTTP-глагол, описанный в справочнике API, для первоначального запроса возобновляемой загрузки или для единственного запроса простой или многокомпонентной загрузки.
  • Используйте PUT для всех последующих запросов на возобновление загрузки после начала текущего. Эти запросы загружают контент независимо от вызываемого метода.

Выполните простую загрузку

Для выполнения простой загрузки используйте метод files.create с uploadType=media .

Ниже показано, как выполнить простую загрузку:

HTTP

  1. Создайте запрос POST к URI метода /upload с параметром запроса uploadType=media :

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

  2. Добавьте данные файла в тело запроса.

  3. Добавьте следующие HTTP-заголовки:

    • Content-Type . Задайте тип носителя MIME загружаемого объекта.
    • Content-Length . Задайте количество загружаемых байтов. Если вы используете кодирование по частям, этот заголовок не требуется.
  4. Отправьте запрос. Если запрос выполнен успешно, сервер возвращает код статуса HTTP 200 OK вместе с метаданными файла. {HTTP}

При простой загрузке создаются базовые метаданные и определяются некоторые атрибуты файла, такие как тип MIME или modifiedTime . Простую загрузку можно использовать, если файлы небольшие и метаданные не важны.

Выполнить многокомпонентную загрузку

Многокомпонентный запрос на загрузку позволяет загружать метаданные и данные в одном запросе. Используйте этот вариант, если отправляемые данные достаточно малы для повторной загрузки целиком в случае сбоя соединения.

Для выполнения многокомпонентной загрузки используйте метод files.create с uploadType=multipart .

Ниже показано, как выполнить многокомпонентную загрузку:

Ява

диск/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;
    }
  }
}

Питон

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

диск/сниппеты/диск_v3/файл_сниппеты/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;
    } 

}

.СЕТЬ

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. Создайте запрос POST к URI метода /upload с параметром запроса uploadType=multipart :

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

  2. Создайте тело запроса. Отформатируйте его в соответствии с типом содержимого multipart/related RFC 2387 , который состоит из двух частей:

    • Метаданные. Метаданные должны располагаться первыми и иметь заголовок Content-Type установленный на application/json; charset=UTF-8 . Добавьте метаданные файла в формате JSON.
    • Медиафайлы. Медиафайлы должны быть указаны на втором месте и иметь заголовок Content-Type любого типа MIME. Добавьте данные файла в раздел «Медиафайлы».

    Обозначьте каждую часть граничной строкой, перед которой ставятся два дефиса. Кроме того, добавьте два дефиса после последней граничной строки.

  3. Добавьте следующие заголовки HTTP верхнего уровня:

    • Content-Type . Установите значение multipart/related и добавьте строку-ограничитель, используемую для обозначения различных частей запроса. Например: Content-Type: multipart/related; boundary=foo_bar_baz
    • Content-Length . Устанавливается на основе общего количества байтов в теле запроса.
  4. Отправьте запрос.

Чтобы создать или обновить только часть метаданных, без связанных данных, отправьте запрос POST или PATCH на стандартную конечную точку ресурса: https://www.googleapis.com/drive/v3/files Если запрос выполнен успешно, сервер возвращает код состояния HTTP 200 OK вместе с метаданными файла.

При создании файлов необходимо указывать расширение в поле name файла. Например, при создании файла JPEG с фотографией можно указать в метаданных что-то вроде "name": "photo.jpg" . Последующие вызовы files.get возвращают свойство fileExtension , доступное только для чтения и содержащее расширение, изначально указанное в поле name .

Выполнить возобновляемую загрузку

Возобновляемая загрузка позволяет возобновить загрузку после прерывания потока данных из-за сбоя связи. Поскольку вам не нужно перезагружать большие файлы с самого начала, возобновляемая загрузка также может снизить использование полосы пропускания в случае сбоя сети.

Возобновляемые загрузки полезны, когда размеры файлов могут значительно различаться или когда существует фиксированное ограничение по времени выполнения запросов (например, фоновые задачи мобильной ОС и некоторые запросы App Engine). Вы также можете использовать возобновляемые загрузки, когда требуется отображать индикатор хода загрузки.

Возобновляемая загрузка состоит из нескольких основных этапов:

  1. Отправьте первоначальный запрос и получите URI возобновляемого сеанса.
  2. Загрузите данные и отслеживайте состояние загрузки.
  3. (необязательно) Если загрузка прервалась, возобновите ее.

Отправьте первоначальный запрос

Чтобы инициировать возобновляемую загрузку, используйте метод files.create с uploadType=resumable .

HTTP

  1. Создайте запрос POST к URI метода /upload с параметром запроса uploadType=resumable :

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

    Если запрос на инициацию выполнен успешно, ответ включает код статуса HTTP 200 OK . Кроме того, он включает заголовок Location , который указывает URI возобновляемого сеанса:

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

    Сохраните URI возобновляемого сеанса, чтобы иметь возможность загрузить данные файла и запросить статус загрузки. Срок действия URI возобновляемого сеанса истекает через неделю.

  2. Если у вас есть метаданные для файла, добавьте их в тело запроса в формате JSON. В противном случае оставьте тело запроса пустым.

  3. Добавьте следующие HTTP-заголовки:

    • X-Upload-Content-Type . Необязательный параметр. Указывается тип MIME данных файла, который будет передаваться в последующих запросах. Если тип MIME данных не указан в метаданных или в этом заголовке, объект передается как application/octet-stream.
    • X-Upload-Content-Length . Необязательно. Задаёт количество байтов данных файла, передаваемых в последующих запросах.
    • Content-Type . Требуется, если у файла есть метаданные. Установите значение application/json; charset=UTF-8 .
    • Content-Length . Обязательно, если не используется кодирование с фрагментированной передачей. Задайте количество байтов в теле исходного запроса.
  4. Отправьте запрос. Если запрос на инициализацию сеанса выполнен успешно, ответ включает код статуса 200 OK HTTP . Кроме того, ответ включает заголовок Location , который указывает URI возобновляемого сеанса. Используйте URI возобновляемого сеанса для загрузки данных файла и запроса статуса загрузки. Срок действия URI возобновляемого сеанса истекает через неделю.

  5. Скопируйте и сохраните URL-адрес возобновляемого сеанса.

  6. Продолжайте загружать контент .

Загрузить контент

Существует два способа загрузки файла с возобновляемым сеансом:

  • Загрузка контента одним запросом : используйте этот подход, если файл можно загрузить одним запросом, если нет фиксированного ограничения по времени для отдельного запроса или вам не нужно отображать индикатор хода загрузки. Этот подход оптимален, поскольку требует меньше запросов и обеспечивает более высокую производительность.
  • Загружайте контент несколькими фрагментами : используйте этот подход, если необходимо сократить объём данных, передаваемых в одном запросе. Уменьшение объёма передаваемых данных может потребоваться при наличии фиксированного ограничения по времени для отдельных запросов, как это может быть в случае с определёнными классами запросов App Engine. Этот подход также полезен, если необходимо предоставить настраиваемый индикатор для отображения хода загрузки.

HTTP - одиночный запрос

  1. Создайте запрос PUT к URI возобновляемого сеанса.
  2. Добавьте данные файла в тело запроса.
  3. Добавьте HTTP-заголовок Content-Length, равный количеству байтов в файле.
  4. Отправьте запрос. Если запрос на загрузку прерван или вы получили ответ 5xx , следуйте процедуре, описанной в разделе «Возобновление прерванной загрузки» .

HTTP - множественные запросы

  1. Создайте запрос PUT к URI возобновляемого сеанса.

  2. Добавьте данные фрагмента в тело запроса. Создавайте фрагменты размером кратным 256 КБ (256 x 1024 байт), за исключением последнего фрагмента, завершающего загрузку. Размер фрагмента должен быть максимально большим, чтобы обеспечить эффективность загрузки.

  3. Добавьте следующие HTTP-заголовки:

    • Content-Length . Устанавливается на количество байтов в текущем фрагменте.
    • Content-Range . Укажите, какие байты в файле вы загружаете. Например, Content-Range: bytes 0-524287/2000000 показывает, что вы загружаете первые 524 288 байт (256 x 1024 x 2) из файла размером 2 000 000 байт.
  4. Отправьте запрос и обработайте ответ. Если запрос на загрузку прерван или вы получили ответ 5xx , следуйте процедуре, описанной в разделе «Возобновление прерванной загрузки» .

  5. Повторите шаги с 1 по 4 для каждого оставшегося фрагмента в файле. Используйте заголовок Range в ответе, чтобы определить, где начать следующий фрагмент. Не думайте, что сервер получил все байты, отправленные в предыдущем запросе.

После завершения загрузки всего файла вы получите ответ 200 OK или 201 Created , а также все метаданные, связанные с ресурсом.

Возобновить прерванную загрузку

Если запрос на загрузку прерывается до ответа или вы получаете ответ 503 Service Unavailable , вам необходимо возобновить прерванную загрузку.

HTTP

  1. Чтобы запросить статус загрузки, создайте пустой запрос PUT к URI возобновляемого сеанса.

  2. Добавьте заголовок Content-Range чтобы указать, что текущая позиция в файле неизвестна. Например, установите Content-Range на */2000000 если общий размер файла составляет 2 000 000 байт. Если вы не знаете полный размер файла, установите Content-Range на */* .

  3. Отправьте запрос.

  4. Обработайте ответ:

    • Ответ 200 OK или 201 Created означает, что загрузка завершена и никаких дальнейших действий не требуется.
    • Ответ 308 Resume Incomplete означает, что вам необходимо продолжить загрузку файла.
    • Ответ 404 Not Found означает, что сеанс загрузки истек и загрузку необходимо перезапустить с самого начала.
  5. Если вы получили ответ 308 Resume Incomplete , обработайте заголовок Range ответа, чтобы определить, какие байты получил сервер. Если в ответе нет заголовка Range , байты не были получены. Например, заголовок Range с bytes=0-42 означает, что были получены первые 43 байта файла, и что следующий фрагмент для загрузки начнётся с байта 44.

  6. Теперь, когда вы знаете, где возобновить загрузку, продолжайте загрузку файла, начиная со следующего байта. Добавьте заголовок Content-Range , чтобы указать, какую часть файла вы отправляете. Например, Content-Range: bytes 43-1999999 означает, что вы отправляете байты с 44 по 2 000 000.

Обработка ошибок загрузки медиафайлов

При загрузке медиафайлов следуйте этим рекомендациям по обработке ошибок:

  • В случае ошибок 5xx возобновите или повторите загрузку, прерванную из-за прерываний соединения. Подробнее об обработке ошибок 5xx . в разделе об ошибках 500, 502, 503, 504 .
  • В случае ошибок 403 rate limit повторите попытку загрузки. Подробнее об обработке ошибок 403 rate limit см. в статье 403 error: rateLimitExceeded .
  • При возникновении ошибок 4xx (включая 403 ) во время возобновляемой загрузки перезапустите её. Эти ошибки указывают на то, что сеанс загрузки истёк и его необходимо перезапустить, запросив новый URI сеанса . Сеансы загрузки также завершаются через неделю бездействия.

Типы импорта в Google Docs

При создании файла на Диске вам может потребоваться преобразовать его в формат Google Workspace, например, в Google Docs или Google Sheets. Например, вы можете преобразовать документ из вашего любимого текстового редактора в формат Docs, чтобы воспользоваться его функциями.

Чтобы преобразовать файл в определенный тип файла Google Workspace, укажите mimeType Google Workspace при создании файла.

Ниже показано, как преобразовать CSV-файл в таблицу Google Workspace:

Ява

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

Питон

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

}

.СЕТЬ

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

Чтобы узнать, доступно ли преобразование, проверьте массив importFormats ресурса about перед созданием файла. Поддерживаемые преобразования доступны динамически в этом массиве. Вот некоторые распространённые форматы импорта:

От К
Microsoft Word, OpenDocument Text, HTML, RTF, простой текст Google Документы
Microsoft Excel, OpenDocument Spreadsheet, CSV, TSV, простой текст Google Таблицы
Microsoft PowerPoint, презентация OpenDocument Google Презентации
JPEG, PNG, GIF, BMP, PDF Google Docs (встраивает изображение в документ)
Обычный текст (специальный тип MIME), JSON Скрипт Google Apps

При загрузке и конвертации медиафайлов во время запроса на update файла Docs, Sheets или Slides заменяется все содержимое документа.

При конвертации изображения в документ Google Drive использует технологию оптического распознавания символов (OCR) для преобразования изображения в текст. Вы можете улучшить качество алгоритма OCR, указав соответствующий код языка BCP 47 в параметре ocrLanguage . Извлечённый текст отображается в документе рядом со встроенным изображением.

Используйте предварительно сгенерированный идентификатор для загрузки файлов

API Диска позволяет получить список предварительно сгенерированных идентификаторов файлов, используемых для загрузки и создания ресурсов. Запросы на загрузку и создание файлов могут использовать эти предварительно сгенерированные идентификаторы. Задайте поле id в метаданных файла.

Чтобы создать предварительно сгенерированные идентификаторы, вызовите files.generateIds , указав количество идентификаторов, которые нужно создать.

Вы можете безопасно повторить загрузку с заранее сгенерированными идентификаторами в случае неопределённой ошибки сервера или тайм-аута. Если файл был успешно создан, последующие попытки возвращают ошибку HTTP 409 , и файлы-дубликаты не создаются.

Определить индексируемый текст для неизвестных типов файлов

Пользователи могут использовать интерфейс Drive для поиска содержимого документов. Вы также можете использовать files.list и поле fullText для поиска содержимого в вашем приложении. Подробнее см. в разделе Поиск файлов и папок .

Диск автоматически индексирует документы для поиска, когда распознаёт их тип, включая текстовые документы, PDF-файлы, изображения с текстом и другие распространённые типы. Если ваше приложение сохраняет другие типы файлов (например, рисунки, видео и ярлыки), вы можете улучшить их поиск, добавив индексируемый текст в поле contentHints.indexableText файла.

Дополнительные сведения об индексируемом тексте см. в разделе Управление метаданными файла .