Загрузка и экспорт файлов

API Google Drive поддерживает несколько типов операций загрузки и экспорта, как указано в следующей таблице:

Действия по загрузке
Получение содержимого файла BLOB с помощью метода files.get с параметром URL alt=media .
Получение содержимого файла BLOB в более ранней версии с помощью метода revisions.get с параметром alt=media URL.
Отображение содержимого файла BLOB в браузере с помощью поля webContentLink .
Загрузка содержимого BLOB-файлов с помощью метода files.download во время длительных операций. Это единственный способ загрузки файлов Google Vids.
Экспортные действия
Сохраните содержимое документа Google Workspace в формате, который может обрабатывать ваше приложение, используя метод files.export .
Отображение содержимого документа Google Workspace в браузере с помощью поля exportLinks .
Отображение содержимого документа Google Workspace в более ранней версии в браузере с помощью поля exportLinks .
Содержимое документов Google Workspace, использующих метод files.download во время длительных операций.

Перед загрузкой или экспортом содержимого файла убедитесь, что пользователи могут загрузить файл, используя поле capabilities.canDownload в ресурсе files .

Описание упомянутых здесь типов файлов, включая файлы BLOB-объектов и файлы Google Workspace, см. в разделе «Типы файлов» .

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

Скачать содержимое файла BLOB

Для загрузки файла BLOB, хранящегося на Google Диск, используйте метод files.get , указав идентификатор загружаемого файла и параметр alt=media URL. Параметр alt=media URL сообщает серверу, что запрашивается загрузка контента в качестве альтернативного формата ответа.

Параметр URL-адреса alt=media является системным параметром, доступным для всех REST API Google. Если вы используете клиентскую библиотеку для API Google Drive, вам не нужно явно указывать этот параметр.

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

Java

drive/snippets/drive_v3/src/main/java/DownloadFile.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
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.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

/* Class to demonstrate use-case of drive's download file. */
public class DownloadFile {

  /**
   * Download a Document file in PDF format.
   *
   * @param realFileId file ID of any workspace document format file.
   * @return byte array stream if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static ByteArrayOutputStream downloadFile(String realFileId) 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();

    try {
      OutputStream outputStream = new ByteArrayOutputStream();

      service.files().get(realFileId)
          .executeMediaAndDownloadTo(outputStream);

      return (ByteArrayOutputStream) outputStream;
    } 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/download_file.py
import io

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaIoBaseDownload


def download_file(real_file_id):
  """Downloads a file
  Args:
      real_file_id: ID of the file to download
  Returns : IO object with location.

  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_id = real_file_id

    # pylint: disable=maybe-no-member
    request = service.files().get_media(fileId=file_id)
    file = io.BytesIO()
    downloader = MediaIoBaseDownload(file, request)
    done = False
    while done is False:
      status, done = downloader.next_chunk()
      print(f"Download {int(status.progress() * 100)}.")

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.getvalue()


if __name__ == "__main__":
  download_file(real_file_id="1KuPmvGq8yoYgbfW74OENMCB5H0n_2Jm9")

Node.js

drive/snippets/drive_v3/file_snippets/download_file.js
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Downloads a file from Google Drive.
 * @param {string} fileId The ID of the file to download.
 * @return {Promise<number>} The status of the download.
 */
async function downloadFile(fileId) {
  // 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});

  // Download the file.
  const file = await service.files.get({
    fileId,
    alt: 'media',
  });

  // Print the status of the download.
  console.log(file.status);
  return file.status;
}

PHP

drive/snippets/drive_v3/src/DriveDownloadFile.php
<?php
use Google\Client;
use Google\Service\Drive;
function downloadFile()
 {
    try {

      $client = new Client();
      $client->useApplicationDefaultCredentials();
      $client->addScope(Drive::DRIVE);
      $driveService = new Drive($client);
      $realFileId = readline("Enter File Id: ");
      $fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
      $fileId = $realFileId;
      $response = $driveService->files->get($fileId, array(
          'alt' => 'media'));
      $content = $response->getBody()->getContents();
      return $content;

    } catch(Exception $e) {
      echo "Error Message: ".$e;
    }

}

.СЕТЬ

drive/snippets/drive_v3/DriveV3Snippets/DownloadFile.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of drive's download file.
    public class DownloadFile
    {
        /// <summary>
        /// Download a Document file in PDF format.
        /// </summary>
        /// <param name="fileId">file ID of any workspace document format file.</param>
        /// <returns>byte array stream if successful, null otherwise.</returns>
        public static MemoryStream DriveDownloadFile(string fileId)
        {
            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"
                });

                var request = service.Files.Get(fileId);
                var stream = new MemoryStream();

                // Add a handler which will be notified on progress changes.
                // It will notify on each chunk download and when the
                // download is completed or failed.
                request.MediaDownloader.ProgressChanged +=
                    progress =>
                    {
                        switch (progress.Status)
                        {
                            case DownloadStatus.Downloading:
                            {
                                Console.WriteLine(progress.BytesDownloaded);
                                break;
                            }
                            case DownloadStatus.Completed:
                            {
                                Console.WriteLine("Download complete.");
                                break;
                            }
                            case DownloadStatus.Failed:
                            {
                                Console.WriteLine("Download failed.");
                                break;
                            }
                        }
                    };
                request.Download(stream);

                return stream;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

В этом примере кода используется метод из библиотеки, который добавляет параметр URL alt=media к базовому HTTP-запросу.

Загрузка файлов, инициированная вашим приложением, должна быть авторизована с использованием области действия, разрешающей чтение содержимого файла. Например, приложение, использующее область действия drive.readonly.metadata не имеет права загружать содержимое файла. В этом примере кода используется ограниченная область действия «drive», которая позволяет пользователям просматривать и управлять всеми вашими файлами в Google Drive. Чтобы узнать больше об областях действия Google Drive, см. раздел «Выбор областей действия API Google Drive» .

Пользователи с правами owner (для файлов в моем Google Диске) или правами organizer (для файлов на общем диске) могут ограничивать загрузку с помощью объекта DownloadRestrictionsMetadata . Для получения дополнительной информации см. раздел «Запрет пользователям загружать, распечатывать или копировать ваш файл» .

Файлы, помеченные как содержащие вредоносный контент (например, вредоносное программное обеспечение), могут быть загружены только владельцем файла. Кроме того, необходимо указать параметр get acknowledgeAbuse=true , чтобы показать, что пользователь осознал риск загрузки потенциально нежелательного программного обеспечения или других вредоносных файлов. Ваше приложение должно интерактивно предупреждать пользователя перед использованием этого параметра запроса.

Частичная загрузка

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

Range: bytes=500-999

Скачать содержимое файла BLOB из более ранней версии

Вы можете загрузить только те версии содержимого BLOB-файлов, которые помечены как «Сохранить навсегда». Если вы хотите загрузить версию, сначала установите для нее параметр «Сохранить навсегда». Для получения дополнительной информации см. раздел «Указание версий для сохранения без автоматического удаления» .

Для загрузки содержимого BLOB-файлов более ранней версии используйте метод revisions.get , указав идентификатор загружаемого файла, идентификатор ревизии и параметр alt=media URL. Параметр alt=media URL сообщает серверу, что запрашивается загрузка содержимого в альтернативном формате ответа. Аналогично методу files.get , метод revisions.get также принимает необязательный параметр запроса acknowledgeAbuse и заголовок Range . Для получения дополнительной информации см. раздел «Управление длительными операциями» .

Здесь представлен протокол запроса.

GET https://www.googleapis.com/drive/v3/files/{FILE_ID}/revisions/{REVISION_ID}?alt=media

Скачать содержимое файла BLOB в браузере

Для загрузки содержимого BLOB-файлов, хранящихся на Google Диск, непосредственно в браузере, а не через API, используйте поле webContentLink ресурса files . Если у пользователя есть доступ к загрузке файла, возвращается ссылка для скачивания файла и его содержимого. Вы можете либо перенаправить пользователя на этот URL, либо предложить его в виде кликабельной ссылки.

Загрузка содержимого BLOB-файлов во время длительных операций.

Для загрузки содержимого BLOB-файлов во время длительных операций используйте метод files.download , указав идентификатор загружаемого файла. При желании можно указать идентификатор ревизии.

Это единственный способ загрузить файлы Google Vids. При попытке экспорта файлов Google Vids вы получите ошибку fileNotExportable . Для получения дополнительной информации см. раздел «Управление длительными операциями» .

Экспорт содержимого документа Google Workspace

Для экспорта содержимого документа Google Workspace в байтах используйте метод files.export , указав идентификатор файла для экспорта и правильный MIME-тип . Экспортируемое содержимое ограничено 10 МБ.

В следующем примере кода показано, как использовать метод files.export для экспорта документа Google Workspace в формат PDF с помощью клиентских библиотек Google Drive API:

Java

drive/snippets/drive_v3/src/main/java/ExportPdf.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
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.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;

/* Class to demonstrate use-case of drive's export pdf. */
public class ExportPdf {

  /**
   * Download a Document file in PDF format.
   *
   * @param realFileId file ID of any workspace document format file.
   * @return byte array stream if successful, {@code null} otherwise.
   * @throws IOException if service account credentials file not found.
   */
  public static ByteArrayOutputStream exportPdf(String realFileId) 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();

    OutputStream outputStream = new ByteArrayOutputStream();
    try {
      service.files().export(realFileId, "application/pdf")
          .executeMediaAndDownloadTo(outputStream);

      return (ByteArrayOutputStream) outputStream;
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to export file: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/file_snippet/export_pdf.py
import io

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from googleapiclient.http import MediaIoBaseDownload


def export_pdf(real_file_id):
  """Download a Document file in PDF format.
  Args:
      real_file_id : file ID of any workspace document format file
  Returns : IO object with location

  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_id = real_file_id

    # pylint: disable=maybe-no-member
    request = service.files().export_media(
        fileId=file_id, mimeType="application/pdf"
    )
    file = io.BytesIO()
    downloader = MediaIoBaseDownload(file, request)
    done = False
    while done is False:
      status, done = downloader.next_chunk()
      print(f"Download {int(status.progress() * 100)}.")

  except HttpError as error:
    print(f"An error occurred: {error}")
    file = None

  return file.getvalue()


if __name__ == "__main__":
  export_pdf(real_file_id="1zbp8wAyuImX91Jt9mI-CAX_1TqkBLDEDcr2WeXBbKUY")

Node.js

drive/snippets/drive_v3/file_snippets/export_pdf.js
import {GoogleAuth} from 'google-auth-library';
import {google} from 'googleapis';

/**
 * Exports a Google Doc as a PDF.
 * @param {string} fileId The ID of the file to export.
 * @return {Promise<number>} The status of the export request.
 */
async function exportPdf(fileId) {
  // 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});

  // Export the file as a PDF.
  const result = await service.files.export({
    fileId,
    mimeType: 'application/pdf',
  });

  // Print the status of the export.
  console.log(result.status);
  return result.status;
}

PHP

drive/snippets/drive_v3/src/DriveExportPdf.php
<?php
use Google\Client;
use Google\Service\Drive;
function exportPdf()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $realFileId = readline("Enter File Id: ");
        $fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo';
        $fileId = $realFileId;
        $response = $driveService->files->export($fileId, 'application/pdf', array(
            'alt' => 'media'));
        $content = $response->getBody()->getContents();
        return $content;

    }  catch(Exception $e) {
         echo "Error Message: ".$e;
    }

}

.СЕТЬ

drive/snippets/drive_v3/DriveV3Snippets/ExportPdf.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Download;
using Google.Apis.Drive.v3;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive export pdf
    public class ExportPdf
    {
        /// <summary>
        /// Download a Document file in PDF format.
        /// </summary>
        /// <param name="fileId">Id of the file.</param>
        /// <returns>Byte array stream if successful, null otherwise</returns>
        public static MemoryStream DriveExportPdf(string fileId)
        {
            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"
                });

                var request = service.Files.Export(fileId, "application/pdf");
                var stream = new MemoryStream();
                // Add a handler which will be notified on progress changes.
                // It will notify on each chunk download and when the
                // download is completed or failed.
                request.MediaDownloader.ProgressChanged +=
                    progress =>
                    {
                        switch (progress.Status)
                        {
                            case DownloadStatus.Downloading:
                            {
                                Console.WriteLine(progress.BytesDownloaded);
                                break;
                            }
                            case DownloadStatus.Completed:
                            {
                                Console.WriteLine("Download complete.");
                                break;
                            }
                            case DownloadStatus.Failed:
                            {
                                Console.WriteLine("Download failed.");
                                break;
                            }
                        }
                    };
                request.Download(stream);
                return stream;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

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

В приведенном примере кода также указан MIME-тип экспорта как application/pdf . Полный список всех поддерживаемых MIME-типов экспорта для каждого документа Google Workspace см. в разделе «MIME-типы экспорта для документов Google Workspace» .

Экспорт содержимого документа Google Workspace в браузере

Для экспорта содержимого документа Google Workspace в браузере используйте поле exportLinks ресурса files . В зависимости от типа документа для каждого доступного MIME-типа возвращается ссылка для загрузки файла и его содержимого. Вы можете либо перенаправить пользователя на URL-адрес, либо предложить ссылку в виде кликабельного файла.

Экспорт содержимого документа Google Workspace в более ранней версии в браузере.

Для экспорта содержимого документа Google Workspace в более ранней версии в браузере используйте метод revisions.get , указав идентификатор загружаемого файла и идентификатор версии, чтобы сгенерировать ссылку для экспорта, по которой можно выполнить загрузку. Если у пользователя есть доступ к загрузке файла, возвращается ссылка для скачивания файла и его содержимого. Вы можете либо перенаправить пользователя на этот URL-адрес, либо предложить его в виде кликабельной ссылки.

Экспорт содержимого документов Google Workspace во время длительных операций.

Для экспорта содержимого документов Google Workspace во время длительных операций используйте метод files.download , указав идентификатор загружаемого файла и идентификатор версии. Дополнительную информацию см. в разделе «Управление длительными операциями» .

Ограничьте способы обмена файлами.