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

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

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

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

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

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

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

Используйте 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 .

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

Ява

диск/фрагменты/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-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_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_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;
    } 

}

.СЕТЬ

диск/фрагменты/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/based 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: rateLimitExceeded .
  • При возникновении любых ошибок 4xx (включая 403 ) во время возобновляемой загрузки перезапустите загрузку. Эти ошибки указывают на то, что срок сеанса загрузки истек, и его необходимо перезапустить, запросив новый URI сеанса . Сеансы загрузки также истекают после одной недели бездействия.

Импорт в типы Документов Google

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

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

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

Ява

диск/фрагменты/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-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_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_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;
    }

}

.СЕТЬ

диск/фрагменты/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, CSV, TSV, обычный текст Google Таблицы
Microsoft PowerPoint, презентация OpenDocument Google Презентации
JPEG, PNG, GIF, BMP, PDF Google Docs (встраивает изображение в документ)
Обычный текст (специальный тип MIME), JSON Скрипт Google Apps

Когда вы загружаете и конвертируете медиафайлы во время запроса update в файл Документов, Таблиц или Презентаций, заменяется все содержимое документа.

Когда вы конвертируете изображение в Документы, Диск использует оптическое распознавание символов (OCR), чтобы преобразовать изображение в текст. Вы можете улучшить качество алгоритма OCR, указав применимый код языка BCP 47 в параметре ocrLanguage . Извлеченный текст появится в документе рядом со встроенным изображением.

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

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

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

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

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

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

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

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