שילוב עם ממשק המשתמש של Drive's "פתיחה באמצעות" תפריט ההקשר

כשמשתמש בוחר קובץ ולוחץ על האפשרות 'פתיחה באמצעות' בתפריט של ממשק המשתמש של Drive, Drive מפנה את המשתמש לכתובת ה-URL לפתיחה של האפליקציה שהוגדרה בהגדרת שילוב של ממשק המשתמש של Drive.

אם סימנתם את התיבה 'ייבוא' כשהגדרתם שילוב של ממשק המשתמש של Drive, המשתמש יוכל לבחור שילוב של קבצים ספציפיים לאפליקציה וקבצים של Google Workspace לפתוח. כשמגדירים שילוב של ממשק המשתמש של Drive, קבצים ספציפיים לאפליקציה מוגדרים בשדות 'סוגי MIME שמוגדרים כברירת מחדל' ו'סיומות קבצים שמוגדרות כברירת מחדל', ואילו קבצים של Google Workspace מוגדרים בשדות 'סוגי MIME משניים' ו'סיומות קבצים משניות'.

עבור כל קובץ שהמשתמש רוצה לפתוח, Drive בודק את סוגי ה-MIME מול סוגי ה-MIME המשניים שמוגדרים כברירת המחדל ומסוג ה-MIME המשני:

  • לסוגי MIME שמוגדרים בשדה 'סוגי MIME המוגדרים כברירת מחדל', מזהה הקובץ מועבר לאפליקציה. למידע על אופן הטיפול בקבצים ספציפיים לאפליקציה, ראו טיפול בכתובת URL פתוחה במסמכים ספציפיים לאפליקציה.

  • לגבי סוגי MIME שמוגדרים בשדה 'סוגי MIME משניים', תוצג תיבת דו-שיח בממשק המשתמש של Drive שבה המשתמש יתבקש לבחור את סוג הקובץ שאליו הוא רוצה להמיר את הקובץ מ-Google Workspace. לדוגמה, אם בחרתם קובץ של Google Docs בממשק המשתמש של Drive, והשדה 'סוגי MIME משניים' מציע שהאפליקציה שלכם תומכת בטקסט/רגיל או באפליקציה/pdf, ממשק המשתמש של Drive ישאל את המשתמש אם הוא רוצה להמיר לטקסט פשוט או ל-PDF.

    מידע נוסף על טיפול בקבצים של Google Workspace זמין במאמר טיפול בכתובת URL פתוחה למסמכים של Google Workspace. רשימה של מסמכי Google Workspace ופורמטים של המרה של סוגי MIME מפורטת במאמר ייצוא סוגי MIME למסמכי Google Workspace.

טיפול בכתובת URL פתוחה למסמכים ספציפיים לאפליקציה

כפי שמתואר בקטע הגדרת שילוב של ממשק המשתמש של Drive, האפליקציה מקבלת משתני תבנית עם מידע שבעזרתו היא יכולה לפתוח את הקובץ. האפליקציה מקבלת קבוצת ברירת מחדל של משתני תבנית בתוך הפרמטר state. פרטי ברירת המחדל של state בכתובת URL פתוחה שספציפית לאפליקציה הם:

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

הפלט הזה כולל את הערכים הבאים:

  • ID: המזהה של תיקיית ההורה.
  • RESOURCE_KEYS: מילון JSON של מזהי קבצים שממופים למפתחות המשאבים המתאימים.
  • open: הפעולה שמתבצעת. הערך הוא open כשמשתמשים בכתובת URL פתוחה.
  • USER_ID: מזהה הפרופיל שמזהה את המשתמש באופן ייחודי.

האפליקציה צריכה לפעול לפי הבקשה הזו באופן הבא:

  1. מוודאים שהשדה action מכיל את הערך open ושהשדה ids נמצא.
  2. משתמשים בערך userId כדי ליצור סשן חדש למשתמש. מידע נוסף על משתמשים מחוברים זמין במאמר משתמשים ואירועים חדשים.
  3. משתמשים בשיטה files.get כדי לבדוק הרשאות, לאחזר מטא-נתונים של קבצים ולהוריד את תוכן הקובץ באמצעות ערכי ID.
  4. אם הוגדר resourceKeys בבקשה, מגדירים את כותרת הבקשה X-Goog-Drive-Resource-Keys. מידע נוסף על מפתחות משאבים זמין במאמר גישה לקבצים ששותפו באמצעות קישור באמצעות מפתחות משאבים.

הפרמטר state מקודד בכתובת URL, ולכן האפליקציה צריכה לטפל בתווי ה-escape ולנתח אותם כ-JSON.

טיפול בכתובת URL פתוחה של מסמכי Google Workspace

כפי שצוין בקטע הגדרת שילוב של ממשק המשתמש של Drive, האפליקציה מקבלת קבוצת ברירת מחדל של משתני תבנית בתוך הפרמטר state. פרטי state שמוגדרים כברירת מחדל לכתובת URL פתוחה ב-Google Workspace הם:

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

הפלט הזה כולל את הערכים הבאים:

  • EXPORT_ID: רשימה מופרדת בפסיקים של מזהי הקבצים שמיוצאים (משמשת רק כשפותחים מסמכים מובנים של Google).
  • RESOURCE_KEYS: מילון JSON של מזהי קבצים שממופים למפתחות המשאבים המתאימים.
  • open: הפעולה שמתבצעת. הערך הוא open כשמשתמשים בכתובת URL פתוחה.
  • USER_ID: מזהה הפרופיל שמזהה את המשתמש.

האפליקציה צריכה לפעול בנוגע לבקשה הזו באמצעות השלבים הבאים:

  1. כדי לוודא שזו בקשה לפתיחת קובץ, מזהים את הערך open בשדה state ואת נוכחות השדה exportIds.

  2. משתמשים ב-method‏ files.get כדי לבדוק את ההרשאות, לאחזר את המטא-נתונים של הקובץ ולקבוע את סוג ה-MIME באמצעות הערכים של EXPORT_ID.

  3. ממירים את תוכן הקובץ באמצעות השיטה files.export. בדוגמת הקוד הבאה מוסבר איך לייצא מסמך מ-Google Workspace לסוג ה-MIME המבוקש.

  4. אם הוגדר resourceKey בבקשה, מגדירים את כותרת הבקשה X-Goog-Drive-Resource-Keys. מידע נוסף על מפתחות משאבים זמין במאמר גישה לקבצים ששותפו באמצעות קישור באמצעות מפתחות משאבים.

    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;
        }
    
    }

להציג קבצים שעברו המרה כקובצי קריאה בלבד או להציג תיבת דו-שיח שמאפשרת למשתמש לשמור את הקובץ כקובץ מסוג חדש.

הפרמטר state מקודד ככתובת URL, כך שהאפליקציה צריכה לטפל בתוויות הבריחה ולנתח אותו כ-JSON.

משתמשים ואירועים חדשים

אפליקציות Drive צריכות להתייחס לכל האירועים מסוג 'פתיחה באמצעות' ככניסות פוטנציאליות. ייתכן שלמשתמשים מסוימים יש מספר חשבונות, לכן ייתכן שמזהה המשתמש בפרמטר state לא יהיה תואם לסשן הנוכחי. אם מזהה המשתמש בפרמטר state לא תואם לסשן הנוכחי, מסיימים את הסשן הנוכחי באפליקציה ונכנסים כמשתמש המבוקש.

בנוסף לפתיחת אפליקציה מממשק המשתמש של Google Drive, אפליקציות יכולות להציג בורר קבצים כדי לבחור תוכן מתוך האפליקציה. מידע נוסף זמין במאמר בורר הקבצים של Google.