ตัวอย่างโค้ดเครื่องมือเลือกของ Google

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีใช้เครื่องมือเลือกรูปภาพหรือหน้าอัปโหลดที่ผู้ใช้เปิดได้จากปุ่มในเว็บแอป

ตัวอย่างนี้รวมฟีเจอร์ Google Picker ไว้ด้วย เช่น การเปิดใช้การเลือกหลายรายการ การซ่อนแผงการนำทาง และการเลือกบัญชีผู้ใช้ด้วยโทเค็น OAuth 2.0 ปัจจุบันของแอป

ในตัวอย่างนี้ คุณต้องระบุหลายรายการดังนี้

  • วิธีค้นหาทั้งรหัสไคลเอ็นต์และคีย์ API

    1. ในคอนโซล Google Cloud ให้ไปที่เมนู > API และบริการ > ข้อมูลเข้าสู่ระบบ

      ไปที่ข้อมูลเข้าสู่ระบบ

  • วิธีค้นหารหัสแอป

    1. ในคอนโซล Google Cloud ให้ไปที่เมนู > IAM & Admin > Settings

      ไปที่การตั้งค่า

    2. ใช้หมายเลขโปรเจ็กต์เป็นรหัสแอป

โปรเจ็กต์ Cloud เดียวกันต้องมีทั้งรหัสไคลเอ็นต์และรหัสแอป เนื่องจากจะใช้เพื่อให้สิทธิ์เข้าถึงไฟล์ของผู้ใช้

drive/picker/helloworld.html
<!DOCTYPE html>
<html>
<head>
  <title>Picker API Quickstart</title>
  <meta charset="utf-8" />
</head>
<body>
<p>Picker API 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>

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

  // TODO(developer): Set to client ID and API key from the Developer Console
  const CLIENT_ID = '<YOUR_CLIENT_ID>';
  const API_KEY = '<YOUR_API_KEY>';

  // TODO(developer): Replace with your own project number from console.developers.google.com.
  const APP_ID = '<YOUR_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) {
      accessToken = null;
      google.accounts.oauth2.revoke(accessToken);
      document.getElementById('content').innerText = '';
      document.getElementById('authorize_button').innerText = 'Authorize';
      document.getElementById('signout_button').style.visibility = 'hidden';
    }
  }

  /**
   *  Create and render a 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 - Containers the user selection from the picker
   */
  async function pickerCallback(data) {
    if (data.action === google.picker.Action.PICKED) {
      let text = `Picker response: \n${JSON.stringify(data, null, 2)}\n`;
      const document = data[google.picker.Response.DOCUMENTS][0];
      const fileId = document[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>
</body>
</html>

ฟังก์ชัน setOAuthToken ช่วยให้แอปใช้โทเค็นการตรวจสอบสิทธิ์ปัจจุบันเพื่อระบุบัญชี Google ที่เครื่องมือเลือกของ Google จะใช้แสดงไฟล์ หากผู้ใช้ลงชื่อเข้าใช้ด้วยบัญชี Google หลายบัญชี เครื่องมือเลือกของ Google จะแสดงไฟล์ของบัญชีที่ได้รับอนุญาตที่เหมาะสมได้

หลังจากได้รับรหัสไฟล์จากเครื่องมือเลือกไฟล์ของ Google เมื่อเปิดไฟล์ แอปพลิเคชันจะดึงข้อมูลเมตาของไฟล์และดาวน์โหลดเนื้อหาของไฟล์ได้ตามที่อธิบายไว้ในเอกสารอ้างอิงสำหรับ files.get