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

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

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

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

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

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

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

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

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

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

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

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

Для выполнения простой загрузки используйте метод create ресурса files с 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 . Простую загрузку можно использовать в случаях, когда у вас небольшие файлы и метаданные файла не важны.

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

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

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

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

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
import fs from 'node:fs';
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Uploads a file to Google Drive.
 * @return {Promise<string|null|undefined>} The ID of the uploaded file.
 */
async function uploadBasic() {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  // The request body for the file to be uploaded.
  const requestBody = {
    name: 'photo.jpg',
    fields: 'id',
  };

  // The media content to be uploaded.
  const media = {
    mimeType: 'image/jpeg',
    body: fs.createReadStream('files/photo.jpg'),
  };

  // Upload the file.
  const file = await service.files.create({
    requestBody,
    media,
  });

  // Print the ID of the uploaded file.
  console.log('File Id:', file.data.id);
  return file.data.id;
}

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" в метаданных. Последующие вызовы метода get возвращают свойство fileExtension доступное только для чтения и содержащее расширение, первоначально указанное в поле name .

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

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

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

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

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

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

Для запуска возобновляемой загрузки используйте метод create ресурса files с 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 Диске вам может потребоваться преобразовать его в формат, аналогичный Google Workspace, например, Google Docs или Google Sheets. Например, вы можете захотеть преобразовать документ из вашего любимого текстового редактора в формат Google Docs, чтобы воспользоваться его функциями.

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

Ниже показано, как преобразовать CSV-файл в таблицу 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
import fs from 'node:fs';
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Uploads a file to Google Drive and converts it to a Google Sheet.
 * @return {Promise<string|null|undefined>} The ID of the uploaded file.
 */
async function uploadWithConversion() {
  // Authenticate with Google and get an authorized client.
  // TODO (developer): Use an appropriate auth mechanism for your app.
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });

  // Create a new Drive API client (v3).
  const service = google.drive({version: 'v3', auth});

  // The metadata for the file to be uploaded and converted.
  const fileMetadata = {
    name: 'My Report',
    // The MIME type to convert the file to.
    mimeType: 'application/vnd.google-apps.spreadsheet',
  };

  // The media content to be uploaded.
  const media = {
    mimeType: 'text/csv',
    body: fs.createReadStream('files/report.csv'),
  };

  // Upload the file with conversion.
  const file = await service.files.create({
    requestBody: fileMetadata,
    media,
    fields: 'id',
  });

  // Print the ID of the uploaded file.
  console.log('File Id:', file.data.id);
  return file.data.id;
}

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

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

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

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

API Google Диска позволяет получить список предварительно сгенерированных идентификаторов файлов, которые можно использовать для создания, копирования и загрузки ресурсов. Для получения дополнительной информации см. раздел «Генерация идентификаторов для использования с вашими файлами» .

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

Обратите внимание, что предварительно сгенерированные идентификаторы не поддерживаются для создания файлов Google Workspace, за исключением MIME-типов application/vnd.google-apps.drive-sdk и application/vnd.google-apps.folder . Аналогично, загрузка файлов, ссылающихся на преобразование в формат файла Google Workspace, не поддерживается.

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

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

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

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