במאמר הזה מוסבר איך להשתמש בתכונות של Google Picker API, כמו הפעלת בחירה מרובה, הסתרת חלונית הניווט ובחירת חשבון המשתמש עם אסימון OAuth 2.0 הנוכחי של האפליקציה.
דרישות מוקדמות
בדוגמה הזו, צריך לציין כמה פריטים:
כדי לאתר את מזהה הלקוח ואת מפתח ה-API:
במסוף Google Cloud, לוחצים על סמל התפריט > APIs & Services > Credentials.
כדי לאתר את מזהה האפליקציה:
במסוף Google Cloud, לוחצים על סמל התפריט > IAM & Admin > Settings.
משתמשים במספר הפרויקט כמזהה האפליקציה.
אותו פרויקט בענן ב-Google Cloud צריך להכיל גם את מזהה הלקוח וגם את מזהה האפליקציה, כי הוא משמש לאישור גישה לקבצים של משתמש.
יצירת אפליקציה לבחירת תמונות במסמך HTML
בדוגמת הקוד הבאה אפשר לראות איך משתמשים בבורר תמונות או בדף להעלאה שמשתמשים יכולים לפתוח באמצעות לחצן באפליקציית אינטרנט.
יוצרים מסמך HTML רגיל לאירוח של כלי בחירת הקבצים של Google:
<!DOCTYPE html>
<html>
<head>
<title>Google Picker API Quickstart</title>
<meta charset="utf-8" />
</head>
<body>
<p>Google Picker API Quickstart</p>
<!--Add buttons to initiate auth sequence and sign out.-->
<button id="authorize_button" onclick="handleAuthClick()">Authorize</button>
<button id="signout_button" onclick="handleSignoutClick()">Sign Out</button>
<pre id="content" style="white-space: pre-wrap;"></pre>
משתמשים ב-JavaScript כדי להפעיל את Google Picker API:
<script type="text/javascript">
/* exported gapiLoaded */
/* exported gisLoaded */
/* exported handleAuthClick */
/* exported handleSignoutClick */
// Authorization scopes required by the API; multiple scopes can be
// included, separated by spaces.
const SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly';
// Replace with your client ID and API key from https://console.cloud.google.com/.
const CLIENT_ID = 'CLIENT_ID';
const API_KEY = 'API_KEY';
// Replace with your project number from https://console.cloud.google.com/.
const APP_ID = 'APP_ID';
let tokenClient;
let accessToken = null;
let pickerInited = false;
let gisInited = false;
document.getElementById('authorize_button').style.visibility = 'hidden';
document.getElementById('signout_button').style.visibility = 'hidden';
/**
* Callback after api.js is loaded.
*/
function gapiLoaded() {
gapi.load('client:picker', initializePicker);
}
/**
* Callback after the API client is loaded. Loads the
* discovery doc to initialize the API.
*/
async function initializePicker() {
await gapi.client.load('https://www.googleapis.com/discovery/v1/apis/drive/v3/rest');
pickerInited = true;
maybeEnableButtons();
}
/**
* Callback after Google Identity Services are loaded.
*/
function gisLoaded() {
tokenClient = google.accounts.oauth2.initTokenClient({
client_id: CLIENT_ID,
scope: SCOPES,
callback: '', // defined later
});
gisInited = true;
maybeEnableButtons();
}
/**
* Enables user interaction after all libraries are loaded.
*/
function maybeEnableButtons() {
if (pickerInited && gisInited) {
document.getElementById('authorize_button').style.visibility = 'visible';
}
}
/**
* Sign in the user upon button click.
*/
function handleAuthClick() {
tokenClient.callback = async (response) => {
if (response.error !== undefined) {
throw (response);
}
accessToken = response.access_token;
document.getElementById('signout_button').style.visibility = 'visible';
document.getElementById('authorize_button').innerText = 'Refresh';
await createPicker();
};
if (accessToken === null) {
// Prompt the user to select a Google Account and ask for consent to share their data
// when establishing a new session.
tokenClient.requestAccessToken({prompt: 'consent'});
} else {
// Skip display of account chooser and consent dialog for an existing session.
tokenClient.requestAccessToken({prompt: ''});
}
}
/**
* Sign out the user upon button click.
*/
function handleSignoutClick() {
if (accessToken) {
google.accounts.oauth2.revoke(accessToken);
accessToken = null;
document.getElementById('content').innerText = '';
document.getElementById('authorize_button').innerText = 'Authorize';
document.getElementById('signout_button').style.visibility = 'hidden';
}
}
/**
* Create and render a Google Picker object for searching images.
*/
function createPicker() {
const view = new google.picker.View(google.picker.ViewId.DOCS);
view.setMimeTypes('image/png,image/jpeg,image/jpg');
const picker = new google.picker.PickerBuilder()
.enableFeature(google.picker.Feature.NAV_HIDDEN)
.enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
.setDeveloperKey(API_KEY)
.setAppId(APP_ID)
.setOAuthToken(accessToken)
.addView(view)
.addView(new google.picker.DocsUploadView())
.setCallback(pickerCallback)
.build();
picker.setVisible(true);
}
/**
* Displays the file details of the user's selection.
* @param {object} data - Contains the user selection from the Google Picker.
*/
async function pickerCallback(data) {
if (data.action === google.picker.Action.PICKED) {
let text = `Google Picker response: \n${JSON.stringify(data, null, 2)}\n`;
const selectedDoc = data[google.picker.Response.DOCUMENTS][0];
const fileId = selectedDoc[google.picker.Document.ID];
console.log(fileId);
const res = await gapi.client.drive.files.get({
'fileId': fileId,
'fields': '*',
});
text += `Drive API response for first document: \n${JSON.stringify(res.result, null, 2)}\n`;
window.document.getElementById('content').innerText = text;
}
}
</script>
<script async defer src="https://apis.google.com/js/api.js" onload="gapiLoaded()"></script>
<script async defer src="https://accounts.google.com/gsi/client" onload="gisLoaded()"></script>
מחליפים את מה שכתוב בשדות הבאים:
- CLIENT_ID: מזהה הלקוח שיצרתם כשנתתם הרשאה לפרטי כניסה מסוג OAuth 2.0 לאפליקציית האינטרנט.
- API_KEY: פרטי הכניסה של מפתח ה-API שיצרתם.
- APP_ID: מספר הפרויקט מתוך פרויקט Google Cloud.
הפונקציה setOAuthToken מאפשרת לאפליקציה להשתמש באסימון האימות הנוכחי כדי לקבוע באיזה חשבון Google הכלי לבחירת קבצים של Google ישתמש כדי להציג את הקבצים. אם משתמש מחובר לכמה חשבונות Google, הכלי לבחירת קבצים של Google יכול להציג את הקבצים של החשבון המתאים שהמשתמש מורשה לגשת אליו.
סוגרים את מסמך ה-HTML:
</body>
</html>
אחרי שמקבלים את מזהה הקובץ מבורר הקבצים של Google כשפותחים קבצים, אפליקציה יכולה לאחזר את המטא-נתונים של הקובץ ולהוריד את תוכן הקובץ כמו שמתואר בשיטה get של המשאב files.
יצירת אובייקט של בוחר תמונות
בדוגמת הקוד הבאה מוצגת הלוגיקה המרכזית ליצירה, להצגה ולטיפול ב-Google Picker API כדי ליצור כלי לבחירת תמונות.
משתמשים ב-JavaScript כדי להפעיל את Google Picker API:
/**
* Create and render a Google Picker object for searching images.
*/
function createPicker() {
// Define what types of files the Picker should show (e.g., images)
const view = new google.picker.View(google.picker.ViewId.DOCS);
view.setMimeTypes('image/png,image/jpeg,image/jpg');
// Build and display the picker.
const picker = new google.picker.PickerBuilder()
.enableFeature(google.picker.Feature.NAV_HIDDEN)
.enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
.setDeveloperKey('API_KEY')
.setAppId('APP_ID')
.setOAuthToken('ACCESS_TOKEN')
.addView(view)
.addView(new google.picker.DocsUploadView()) // Adds an upload tab
.setCallback(pickerCallback)
.build();
picker.setVisible(true);
}
/**
* Displays the file details of the user's selection.
* @param {object} data - Contains the user selection from the Google Picker.
*/
async function pickerCallback(data) {
if (data.action === google.picker.Action.PICKED) {
let text = `Google Picker response: \n${JSON.stringify(data, null, 2)}\n`;
// Extract the ID of the first selected document.
const selectedDoc = data[google.picker.Response.DOCUMENTS][0];
const fileId = selectedDoc[google.picker.Document.ID];
console.log("Selected File ID:", fileId);
// Optional: Fetch metadata using the Drive API based on the selected file ID.
const res = await gapi.client.drive.files.get({
'fileId': fileId,
'fields': '*',
});
text += `Drive API response for first document: \n${JSON.stringify(res.result, null, 2)}\n`;
// Update your UI with the results
console.log(text);
}
}
מחליפים את מה שכתוב בשדות הבאים:
- API_KEY: פרטי הכניסה של מפתח ה-API שיצרתם.
- APP_ID: מספר הפרויקט מתוך פרויקט Google Cloud.
- ACCESS_TOKEN: אסימון OAuth 2.0 של האפליקציה.