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 mục "Mở bằng" trong giao diện người dùng của Drive, Drive sẽ chuyển hướng người dùng đến URL mở của ứng dụng đó được xác định trong phần Định cấu hình chế độ tích hợp giao diện người dùng của Drive.

Nếu bạn đánh dấu vào hộp "Nhập" khi định cấu hình một chế độ tích hợp giao diện người dùng Drive, thì người dùng có thể chọn một tổ hợp các tệp dành riêng cho ứng dụng và các tệp trên Google Workspace để mở. Khi bạn định cấu hình chế độ tích hợp giao diện người dùng Drive, các tệp dành riêng cho ứng dụng sẽ được xác định trong các trường "Loại MIME mặc định" và "Phần mở rộng tệp mặc định", trong khi các tệp Google Workspace sẽ được xác định trong các trường "Loại MIME phụ" và "Phần mở rộng tệp phụ".

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

  • Đối với các loại MIME được xác định trong trường "Loại MIME mặc định", mã nhận dạng tệp sẽ được truyền đế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 phần Xử lý URL mở cho các tài liệu dành riêng cho ứng dụng.

  • Đối với các loại MIME được xác định trong trường "Loại MIME phụ", giao diện người dùng Drive sẽ hiển thị một hộp thoại hỏi người dùng loại tệp cần chuyển đổi tệp Google Workspace. 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à trường "Loại MIME phụ" cho biết ứng dụng của bạn hỗ trợ text/plain hoặc application/pdf, thì giao diện người dùng Drive sẽ hỏi người dùng xem họ có muốn chuyển đổi sang Văn bản thuần tuý hoặc PDF hay không.

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

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

Như đã đề cập trong phần Định cấu hình chế độ tích hợp giao diện người dùng Drive, ứng dụng của bạn sẽ nhận được các biến mẫu có thông tin để ứng dụng mở 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. Thông tin state mặc định cho một 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ã nhận dạng của thư mục mẹ.
  • RESOURCE_KEYS: Từ điển JSON gồm các mã nhận dạng tệp được liên kết với khoá tài nguyên tương ứng.
  • open: Thao tác đang được thực hiện. Giá trị là open khi sử dụng một URL mở.
  • USER_ID: Mã nhận dạng hồ sơ giúp xác định người dùng một cách duy nhất.

Ứng dụng của bạn phải xử lý 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ị là open và trường ids xuất hiện.
  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 bài viết 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, tìm nạp siêu dữ liệu tệp và tải nội dung tệp xuống bằng các giá trị ID.
  4. Nếu resourceKeys được đặt trên yêu cầu, hãy đặt tiêu đề yêu cầu X-Goog-Drive-Resource-Keys. Để biết thêm thông tin về khoá tài nguyên, hãy xem bài viết Truy cập vào các tệp được chia sẻ qua đường liên kết bằng khoá tài nguyên.

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

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

Như đã đề cập trong phần Định cấu hình chế độ tích hợp giao diện người dùng Drive, ứng dụng của bạn sẽ nhận được một nhóm biến mẫu mặc định trong tham số state. Thông tin state mặc định cho một 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 mã nhận dạng tệp được xuất, phân tách bằng dấu phẩy (chỉ dùng khi mở tài liệu tích hợp của Google).
  • RESOURCE_KEYS: Từ điển JSON gồm các mã nhận dạng tệp được liên kết với khoá tài nguyên tương ứng.
  • open: Thao tác đang được thực hiện. Giá trị là open khi sử dụng một URL mở.
  • USER_ID: Mã hồ sơ dùng để xác định người dùng.

Ứng dụng của bạn phải xử lý 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ở một tệp bằng cách phát hiện cả giá trị 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, 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 các giá trị EXPORT_ID.

  3. Chuyển đổi nội dung tệp bằng phương thức files.export. Mã mẫu sau đây cho biết cách xuất một tài liệu trên Google Workspace sang loại MIME được yêu cầu.

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

    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
    <?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 hiển thị 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á bằng URL, vì vậy, ứng dụng của bạn phải xử lý các ký tự thoát và phân tích cú pháp tham số này dưới dạng JSON.

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

Các ứng dụng Drive nên coi tất cả sự kiện "mở bằng" là các lượt đăng nhập tiềm năng. Một số người dùng có thể có nhiều tài khoản, nên mã nhận dạng người dùng trong tham số 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 tham số 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 của bạn và đăng nhập với tư cách là người dùng được yêu cầu.

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