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

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

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

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

  • בסוגי MIME שמוגדרים בשדה Default MIME types, מזהה הקובץ מועבר לאפליקציה. למידע על אופן הטיפול בקבצים ספציפיים לאפליקציה, קראו את המאמר טיפול בכתובת 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 ל-Open 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. משתמשים בשיטה files.get כדי לבדוק הרשאות, לאחזר מטא-נתונים של קבצים ולזהות את סוג ה-MIME באמצעות הערכים של EXPORT_ID.

  3. ממירים את תוכן הקובץ באמצעות ה-method 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, ולכן האפליקציה צריכה לטפל בתווים בריחה (escape) ולנתח אותו כ-JSON.

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

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

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