שילוב עם ממשק המשתמש של 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 משניים' מציע שהאפליקציה תומכת ב-text/plain או ב-application/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, כך שהאפליקציה צריכה לטפל בתוויות הבריחה ולנתח אותו כ-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.