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

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

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

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

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

Загрузить содержимое файла больших двоичных объектов

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

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

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

Джава

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

Питон

диск/фрагменты/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_v3/file_snippets/download_file.js
/**
 * Downloads a file
 * @param{string} realFileId file ID
 * @return{obj} file status
 * */
async function downloadFile(realFileId) {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});

  fileId = realFileId;
  try {
    const file = await service.files.get({
      fileId: fileId,
      alt: 'media',
    });
    console.log(file.status);
    return file.status;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

диск/фрагменты/drive_v3/src/DriveDownloadFile.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_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 , не имеет права загружать содержимое файла. В этом примере кода используется ограниченная область файлов «диск», которая позволяет пользователям просматривать все ваши файлы на Диске и управлять ими. Дополнительную информацию об областях действия Диска см. в разделе Выбор областей действия API Google Диска .

Пользователи с разрешениями на редактирование могут ограничить загрузку пользователями только для чтения, установив для поля copyRequiresWriterPermission значение false .

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

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

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

Range: bytes=500-999

Загрузите содержимое файла больших двоичных объектов в более ранней версии.

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

Загрузка содержимого файла BLOB-объекта в браузере

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

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

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

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

Джава

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

Питон

диск/фрагменты/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_v3/file_snippets/export_pdf.js
/**
 * Download a Document file in PDF format
 * @param{string} fileId file ID
 * @return{obj} file status
 * */
async function exportPdf(fileId) {
  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});

  try {
    const result = await service.files.export({
      fileId: fileId,
      mimeType: 'application/pdf',
    });
    console.log(result.status);
    return result;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

диск/фрагменты/drive_v3/src/DriveExportPdf.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_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 , которая позволяет пользователям просматривать все ваши файлы на Диске и управлять ими. Дополнительную информацию об областях действия Диска см. в разделе Выбор областей действия 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-адрес, либо предложить его в виде кликабельной ссылки.