Tích hợp với giao diện người dùng Drive, "Mở bằng" trình đơn theo bối cảnh

Khi người dùng chọn một tệp và nhấp vào phần "Open with" (Mở bằng) của giao diện người dùng Drive mục trong trình đơn, lệnh chuyển hướng Drive người dùng truy cập vào URL Mở của ứng dụng đó được xác định trong phần Định cấu hình giao diện người dùng Drive tích hợp.

Nếu bạn chọn hộp kiểm "Đang nhập" khi bạn định cấu hình giao diện người dùng Drive tích hợp, người dùng có thể chọn kết hợp giữa Các tệp Google Workspace cần mở. Khi bạn định cấu hình giao diện người dùng của Drive tích hợp, các tệp dành riêng cho ứng dụng được xác định trong "Loại MIME mặc định" và "Đuôi tệp mặc định" trong khi Google Workspace tệp được xác định trong "Loại MIME phụ" và "Đuôi tệp phụ" mới.

Đối với mỗi tệp mà người dùng muốn mở, Drive sẽ kiểm tra MIME so với loại MIME mặc định và phụ đã xác định:

  • Đối với loại MIME được xác định trong "Loại MIME mặc định" thì mã tệp là đến ứng dụng của bạn. Để biết thông tin về cách xử lý các tệp dành riêng cho ứng dụng, hãy xem bài viết Xử lý URL mở cho tài liệu dành riêng cho ứng dụng.

  • Đối với loại MIME được xác định trong "Loại MIME phụ" trường, các trường Giao diện người dùng của Drive hiển thị một hộp thoại hỏi người dùng xem nên lưu loại tệp nào chuyển đổi tệp Google Workspace sang. Ví dụ: nếu bạn chọn một Tệp Google Tài liệu trong giao diện người dùng Drive và "MIME phụ loại" đề xuất ứng dụng của bạn hỗ trợ văn bản/đơn giản hoặc ứng dụng/pdf, Giao diện người dùng của Drive hỏi người dùng xem họ có muốn chuyển đổi sang Văn bản thuần tuý hay không hoặc PDF.

    Để biết thông tin về cách xử lý Google Workspace hãy xem bài viết Xử lý URL mở cho các tài liệu trên Google Workspace. Để xem danh sách các tài liệu trên Google Workspace và định dạng chuyển đổi loại MIME, xem bài viết Xuất các loại MIME cho Google Workspace tài liệu.

Xử lý một URL mở cho tài liệu dành riêng cho ứng dụng

Như đề cập trong bài viết Định cấu hình giao diện người dùng trên Drive tích hợp, ứng dụng của bạn nhận các biến mẫu chứa thông tin để mở ứng dụng tệp. Ứng dụng của bạn nhận được một bộ biến mẫu mặc định trong tham số state. Chiến lược phát hành đĩa đơn thông tin state mặc định cho URL mở dành riêng cho ứng dụng là:

{
  "ids": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

Kết quả này bao gồm các giá trị sau:

  • ID: Mã của thư mục mẹ.
  • RESOURCE_KEYS: Từ điển JSON gồm các mã tệp được ánh xạ tới khoá tài nguyên tương ứng.
  • open: Hành động đang được thực hiện. Giá trị là open khi sử dụng thuộc tính Open (Mở) URL.
  • USER_ID: Mã hồ sơ xác định duy nhất người dùng.

Ứng dụng của bạn phải hành động theo yêu cầu này bằng cách làm theo các bước sau:

  1. Xác minh rằng trường action có giá trị open và trường ids là hiện tại.
  2. Sử dụng giá trị userId để tạo một phiên mới cho người dùng. Để biết thêm thông tin về người dùng đã đăng nhập, hãy xem phần Người dùng và sự kiện mới.
  3. Sử dụng phương thức files.get để kiểm tra quyền truy cập, tìm nạp siêu dữ liệu tệp và tải nội dung tệp xuống bằng cách sử dụng các giá trị ID.
  4. Nếu bạn đặt resourceKeys cho yêu cầu, hãy đặt giá trị Tiêu đề của yêu cầu X-Goog-Drive-Resource-Keys. Để biết thêm thông tin về khoá tài nguyên, xem phần Truy cập vào tệp được chia sẻ liên kết bằng tài nguyên khoá.

Tham số state được mã hoá URL, vì vậy ứng dụng của bạn phải xử lý ký tự thoát và phân tích cú pháp tệp đó dưới dạng JSON.

Xử lý một URL mở cho các tài liệu trên Google Workspace

Như đề cập trong bài viết Định cấu hình giao diện người dùng trên Drive tích hợp, ứng dụng của bạn sẽ nhận được tập hợp biến mẫu trong thông số state. Thông tin mặc định về state đối với URL Mở của Google Workspace là:

{
  "exportIds": ["ID"],
  "resourceKeys":{"RESOURCE_KEYS":"RESOURCE_KEYS"},
  "action":"open",
  "userId":"USER_ID"
}

Kết quả này bao gồm các giá trị sau:

  • EXPORT_ID: Danh sách các mã tệp được phân tách bằng dấu phẩy đã xuất (chỉ dùng khi mở các tài liệu Google tích hợp sẵn).
  • RESOURCE_KEYS: Từ điển JSON gồm các mã tệp được ánh xạ tới khoá tài nguyên tương ứng.
  • open: Hành động đang được thực hiện. Giá trị là open khi sử dụng thuộc tính Open (Mở) URL.
  • USER_ID: Mã hồ sơ xác định người dùng.

Ứng dụng của bạn phải hành động theo yêu cầu này bằng cách làm theo các bước sau:

  1. Xác minh rằng đây là yêu cầu mở tệp bằng cách phát hiện cả open trong trường state và sự hiện diện của trường exportIds.

  2. Sử dụng phương thức files.get để kiểm tra quyền truy cập, tìm nạp siêu dữ liệu tệp và xác định loại MIME bằng cách sử dụng Giá trị EXPORT_ID.

  3. Chuyển đổi nội dung tệp bằng cách sử dụng Phương thức files.export. Nội dung sau đây mã mẫu hướng dẫn cách xuất một tài liệu trong Google Workspace sang loại MIME được yêu cầu.

  4. Nếu bạn đặt resourceKey cho yêu cầu, hãy đặt giá trị Tiêu đề của yêu cầu X-Goog-Drive-Resource-Keys. Để biết thêm thông tin về khoá tài nguyên, xem phần Truy cập vào tệp được chia sẻ liên kết bằng tài nguyên khoá.

    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
    /**
     * 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/snippets/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;
        }
    
    }

Hiển thị các tệp đã chuyển đổi ở chế độ chỉ đọc hoặc trình bày một hộp thoại cho phép người dùng lưu tệp dưới dạng loại tệp mới.

Tham số state được mã hoá URL, vì vậy ứng dụng của bạn phải xử lý ký tự thoát và phân tích cú pháp tệp đó dưới dạng JSON.

Người dùng và sự kiện mới

Các ứng dụng Drive phải xử lý mọi thao tác "mở bằng" các sự kiện dưới dạng tiềm năng đăng nhập. Một số người dùng có thể có nhiều tài khoản, vì vậy, mã nhận dạng người dùng trong state có thể không khớp với phiên hiện tại. Nếu mã nhận dạng người dùng trong state không khớp với phiên hiện tại, hãy kết thúc phiên hiện tại cho ứng dụng và đăng nhập bằng tên người dùng được yêu cầu.

Ngoài việc mở ứng dụng từ giao diện người dùng Google Drive, các ứng dụng có thể hiển thị bộ chọn tệp để chọn nội dung trong một ứng dụng. Để biết thêm hãy xem Công cụ chọn của Google.