เอกสารนี้อธิบายวิธีใช้ฟีเจอร์ Google Picker API เช่น การเปิดใช้ การเลือกหลายรายการ การซ่อนแผงการนำทาง และการเลือกบัญชีผู้ใช้ด้วย โทเค็น OAuth 2.0 ปัจจุบันของแอป
ข้อกำหนดเบื้องต้น
สำหรับตัวอย่างนี้ คุณต้องระบุรายการต่อไปนี้
วิธีค้นหาทั้งรหัสไคลเอ็นต์และคีย์ API
ในคอนโซล Google Cloud ให้ไปที่เมนู > API และบริการ > ข้อมูลเข้าสู่ระบบ
วิธีค้นหารหัสแอป
ในคอนโซล Google Cloud ให้ไปที่เมนู > IAM และผู้ดูแลระบบ > การตั้งค่า
ใช้หมายเลขโปรเจ็กต์สำหรับรหัสแอป
โปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google เดียวกันต้องมีทั้งรหัสไคลเอ็นต์และรหัสแอป เนื่องจากใช้เพื่อให้สิทธิ์เข้าถึงไฟล์ของผู้ใช้
สร้างแอปตัวเลือกรูปภาพภายในเอกสาร HTML
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีใช้ตัวเลือกรูปภาพหรือหน้าอัปโหลดที่ ผู้ใช้เปิดได้จากปุ่มในเว็บแอป
สร้างเอกสาร HTML มาตรฐานเพื่อโฮสต์ Google Picker โดยทำดังนี้
<!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 Picker ใช้เพื่อแสดงไฟล์ หาก
ผู้ใช้ลงชื่อเข้าใช้ด้วยบัญชี Google หลายบัญชี เครื่องมือเลือกของ Google จะ
แสดงไฟล์ของบัญชีที่ได้รับอนุญาตที่เหมาะสมได้
ปิดเอกสาร HTML โดยทำดังนี้
</body>
</html>
หลังจากได้รับรหัสไฟล์จาก Google Picker เมื่อเปิดไฟล์แล้ว
แอปจะดึงข้อมูลเมตาของไฟล์และดาวน์โหลดเนื้อหาของไฟล์ได้ตามที่อธิบายไว้ในเมธอด 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 ของแอป