Cara mengunggah file ke Google Drive dengan API menggunakan PHP

Programming

oleh Vinci terakhir diubah pada 5 Agustus 2022.

Mengunggah file ke Google Drive dilakukan secara terprogram oleh Google API. Ini menggunakan OAuth untuk mengautentikasi permintaan dan mengotorisasi akses.

Tutorial ini menjelaskan cara mengunggah file ke Google Drive menggunakan PHP. Ini menyediakan skrip PHP sederhana untuk dengan mudah memahami Google API dan mengunggah file.

Itu juga menggunakan database untuk menyimpan detail file yang diunggah dengan referensi Google Drive.

Menangani kesalahan yang terjadi selama proses pengunggahan karena alasan berikut.

  1. Ketika file biner pada skrip PHP kosong.
  2. Ketika pengguna tidak dapat mengirimkan formulir dan mengunggah tanpa informasi formulir.
  3. Saat permintaan OAuth Google untuk mendapatkan token akses gagal.
  4. Ketika permintaan cURL ke Google API gagal, itu mengembalikan kode status 200.

Pada unggahan yang berhasil tanpa ambiguitas di atas, kode ini akan menampilkan tautan Google Drive untuk melihat pratinjau file yang diunggah.

Gambar di bawah menunjukkan formulir unggah file dengan respons sukses dan gagal.

php google drive unggah

Cara membuat kredensial API untuk mengakses Google Drive

Masuk ke akun Google Anda dan buka konsol pengembang. Kemudian ikuti langkah-langkah di bawah ini untuk membuat kredensial API untuk mengakses Google Drive untuk mengunggah file.

  1. Buat proyek baru atau pilih proyek yang sudah ada dari tab Google Console.
  2. Klik Perpustakaan Aktifkan menu API Google Drive. Gunakan filter untuk memilih API ini.
  3. Pilihan Halaman persetujuan OAuth Menu untuk membuat program untuk mendaftarkan program, isikan item berikut.
    • Nama program
    • Dukungan email
    • Domain resmi
    • Detail kontak pengembang (email).
  4. Pilih Kredensial -> Buat Kredensiallalu pilih ID klien OAuth. Kemudian, masukkan informasi berikut.
    • Pilih Jenis program seperti aplikasi web.
    • Tambahkan sumber JavaScript resmi.
    • Tambahkan URI pengalihan yang diizinkan.

Setelah menyelesaikan langkah-langkah ini, konsol akan menampilkan ID Klien Web Google dan Kunci Rahasia. Kredensial ini digunakan untuk proses autentikasi untuk mengakses Google Drive.

Validasi

Contoh struktur file program

Mari kita lihat contoh kode PHP yang dibuat untuk artikel ini untuk mengunggah file ke Google Drive. Gambar berikut menunjukkan struktur file dari contoh ini.

Contoh pengunggahan file Google drive

File konfigurasi aplikasi

File PHP ini berisi konstanta yang digunakan dalam contoh ini. Kredensial API dan titik akhir disimpan sebagai konstanta PHP dengan file ini.

URI titik akhir yang dikonfigurasi dalam file ini adalah untuk menekan Google Drive API untuk tujuan berikut.

  • Untuk menyetel domain selama pengalihan OAuth.
  • Untuk mendapatkan kata sandi akses setelah mengautentikasi dengan kredensial API GOOGLE_WEB_CLIENT_ID Dan GOOGLE_WEB_CLIENT_SECRET.
  • Untuk mengunggah file di Drive
  • Untuk menambahkan metadata ke file yang diunggah

ini AUTHORIZED_REDIRECT_URI Pengaturan panggilan balik. API memanggil URI ini dengan kode akses untuk terus mengunggah file setelah autentikasi.

lib/Config.php

<?php

class Config
{

    const GOOGLE_WEB_CLIENT_ID = 'add client id';

    const GOOGLE_WEB_CLIENT_SECRET = 'add client secret';

    const GOOGLE_ACCESS_SCOPE = 'https://www.googleapis.com/auth/drive';

    const AUTHORIZED_REDIRECT_URI = 'https://domain-name/php-google-drive-upload/callback.php';

    const GOOGLE_OAUTH2_TOKEN_URI = 'https://oauth2.googleapis.com/token';

    const GOOGLE_DRIVE_FILE_UPLOAD_URI = 'https://www.googleapis.com/upload/drive/v3/files';

    const GOOGLE_DRIVE_FILE_META_URI = 'https://www.googleapis.com/drive/v3/files/';
}

?>

Formulir pendaratan dengan opsi unggah file

Ini adalah bentuk HTML sederhana yang memanggil titik akhir PHP upload.php Dalam mengirimkan data file ke file PHP ini untuk diunggah ke direktori lokal dan ke Google Drive.

Saya baru saja menangani validasi lapangan menggunakan HTML5 Diperlukan Kata sifat. Anda juga dapat menambahkan validasi JavaScript eksklusif untuk formulir unggah file ini.

Kami telah melihat kode untuk melakukan validasi file sisi server di PHP.

index.php

<?php
session_start();

?>
<html>
<head>
<title>How to upload file to Google drive</title>
<link rel="stylesheet" type="text/css" href="https://phppot.com/php/how-to-upload-files-to-google-drive-with-api-using-php/css/style.css" />
<link rel="stylesheet" type="text/css" href="css/form.css" />
<style>
input.btn-submit {
    background: #ffc72c url("google-drive-icon.png") no-repeat center left
        45px;
    text-align: right;
    padding-right: 45px;
}
</style>
</head>
<body>
    <div class="phppot-container tile-container">
        <form method="post" action="upload.php" class="form"
            enctype="multipart/form-data">
<?php if(!empty($_SESSION['responseMessage'])){ ?>
    <div id="phppot-message"
                class="<?php echo $_SESSION['responseMessage']['messageType']; ?>">
                <?php echo $_SESSION['responseMessage']['message']; ?>
    </div>
<?php
    $_SESSION['responseMessage'] = "";
}
?>
<h2 class="text-center">Upload file to drive</h2>
            <div>
                <div class="row">
                    <label class="inline-block">Select file to upload</label>
                    <input type="file" name="file" class="full-width"
                        required>

                </div>
                <div class="row">
                    <input type="submit" name="submit"
                        value="Upload to Drive"
                        class="btn-submit full-width">
                </div>
            </div>
        </form>

    </div>
</body>
</html>

Unggah kode PHP file ke direktori, simpan ke database, dan arahkan ke Google

Titik akhir ini melakukan tindakan bentuk HTML mengunggah file ke direktori. Menyimpan jalur file dalam database dan mengalihkan ke URI OAuth Google.

URI cakupan ini menetapkan ID klien aplikasi dan jalur pengalihan (callback.php) untuk menerima kode akses dari titik akhir API Google Drive.

Jika terjadi kesalahan, perangkat lunak akan memanggil Utils untuk mengidentifikasi dan memandu pengguna dengan benar.

upload.php

<?php
session_start();
require_once __DIR__ . '/lib/Util.php';
$util = new Util();

if (! empty($_POST['submit'])) {
    require_once __DIR__ . '/lib/Config.php';

    require_once __DIR__ . '/lib/FileModel.php';
    $fileModel = new FileModel();

    if (! empty($_FILES["file"]["name"])) {
        $fileName = basename($_FILES["file"]["name"]);
        $targetFilePath = "data/" . $fileName;
        if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetFilePath)) {
            $fileInsertId = $fileModel->insertFile($fileName);
            if ($fileInsertId) {
                $_SESSION['fileInsertId'] = $fileInsertId;

                $googleOAuthURI = 'https://accounts.google.com/o/oauth2/auth?scope=" .
                urlencode(Config::GOOGLE_ACCESS_SCOPE) . "&redirect_uri=' .
                Config::AUTHORIZED_REDIRECT_URI . '&response_type=code&client_id=' .
                Config::GOOGLE_WEB_CLIENT_ID . '&access_type=online';

                header("Location: $googleOAuthURI");
                exit();
            } else {
                $util->redirect("error", 'Failed to insert into the database.');
            }
        } else {
            $util->redirect("error", 'Failed to upload file.');
        }
    } else {
        $util->redirect("error", 'Choose file to upload.');
    }
} else {
    $util->redirect("error", 'Failed to find the form data.');
}
?>

Hubungi kembali untuk menerima kode akses dan lanjutkan mengunggah file ke Google Drive

Halaman ini dipanggil oleh Google API setelah permintaan OAuth dibuat. API mengirimkan kode parameter saat memanggil URL pengalihan ini.

panggilan getAccessToken() Sebuah fungsi yang didefinisikan dalam kelas layanan. Ini melewati kredensial API untuk mendapatkan kode akses.

Setelah kata sandi diterima, itu membuat konten file dan meta file untuk diunggah ke Google Drive melalui permintaan cURL.

ini uploadFileToGoogleDrive() Menerima kata sandi dan informasi file untuk mengatur opsi cURL. Mengembalikan ID file dari file yang diunggah ke Google Drive.

Kemudian addFileMeta() Fungsi PHP menerima array metadata file. Mengembalikan metadata file Google Drive yang diterima sebagai respons cURL.

Pengidentifikasi metadata ini digunakan dalam respons yang berhasil untuk memungkinkan pengguna melihat file yang diunggah di Google Drive.

panggilan balik.php

<?php
session_start();
require_once __DIR__ . '/lib/Util.php';
$util = new Util();
if (isset($_GET['code'])) {

    require_once __DIR__ . '/lib/Config.php';

    require_once __DIR__ . '/lib/GoogleDriveUploadService.php';
    $googleDriveUploadService = new GoogleDriveUploadService();

    $googleResponse = $googleDriveUploadService->getAccessToken(Config::GOOGLE_WEB_CLIENT_ID, Config::AUTHORIZED_REDIRECT_URI, Config::GOOGLE_WEB_CLIENT_SECRET, $_GET['code']);
    $accessToken = $googleResponse['access_token'];

    if (! empty($accessToken)) {

        require_once __DIR__ . '/lib/FileModel.php';
        $fileModel = new FileModel();

        $fileId = $_SESSION['fileInsertId'];

        if (! empty($fileId)) {

            $fileResult = $fileModel->getFileRecordById($fileId);
            if (! empty($fileResult)) {
                $fileName = $fileResult[0]['file_base_name'];
                $filePath="data/" . $fileName;
                $fileContent = file_get_contents($filePath);
                $fileSize = filesize($filePath);
                $filetype = mime_content_type($filePath);

                try {
                    // Move file to Google Drive via cURL
                    $googleDriveFileId = $googleDriveUploadService->uploadFileToGoogleDrive($accessToken, $fileContent, $filetype, $fileSize);
                    if ($googleDriveFileId) {
                        $fileMeta = array(
                            'name' => basename($fileName)
                        );
                        // Add file metadata via Google Drive API
                        $googleDriveMeta = $googleDriveUploadService->addFileMeta($accessToken, $googleDriveFileId, $fileMeta);
                        if ($googleDriveMeta) {
                            $fileModel->updateFile($googleDriveFileId, $fileId);

                            $_SESSION['fileInsertId'] = '';
                            $driveLink = '<a href="https://drive.google.com/open?id=' . $googleDriveMeta['id'] . '" target="_blank"><b>Open in Google Drive</b></a>.';
                            $util->redirect("success", 'File uploaded. ' . $driveLink);
                        }
                    }
                } catch (Exception $e) {
                    $util->redirect("error", $e->getMessage());
                }
            } else {
                $util->redirect("error", 'Failed to get the file content.');
            }
        } else {
            $util->redirect("error", 'File id not found.');
        }
    } else {
        $util->redirect("error", 'Something went wrong. Access forbidden.');
    }
}
?>

Kelas layanan PHP untuk menyiapkan permintaan dan memanggil Google Drive API melalui cURL

Kelas layanan berisi fungsi yang membuat permintaan PHP cURL untuk mencapai Google Drive API.

Semua permintaan cURL menggunakan metode POST untuk mengirim parameter ke titik akhir API.

Menerima kode respons dan data dalam format yang ditentukan. Melempar pengecualian jika kesalahan cURL terjadi atau kode respons selain 200 diterima.

Setelah menerima kode status 200, ia menerima referensi file Google Drive dan respons metadata JSON dengan tepat.

lib/GoogleDriveUploadService.php

<?php
require_once __DIR__ . '/Config.php';

class GoogleDriveUploadService
{

    public function getAccessToken($clientId, $authorizedRedirectURI, $clientSecret, $code)
    {
        $curlPost="client_id=" . $clientId . '&redirect_uri=' . $authorizedRedirectURI . '&client_secret=" . $clientSecret . "&code=" . $code . "&grant_type=authorization_code';
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, Config::GOOGLE_OAUTH2_TOKEN_URI);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        $curlResponse = json_decode(curl_exec($curl), true);
        $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        if ($responseCode != 200) {
            $errorMessage="Problem in getting access token";
            if (curl_errno($curl)) {
                $errorMessage = curl_error($curl);
            }
            throw new Exception('Error: ' . $responseCode . ': ' . $errorMessage);
        }

        return $curlResponse;
    }

    public function uploadFileToGoogleDrive($accessToken, $fileContent, $filetype, $fileSize)
    {
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, Config::GOOGLE_DRIVE_FILE_UPLOAD_URI . '?uploadType=media');
        curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $fileContent);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Content-Type: ' . $filetype,
            'Content-Length: ' . $fileSize,
            'Authorization: Bearer ' . $accessToken
        ));

        $curlResponse = json_decode(curl_exec($curl), true);
        $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        if ($responseCode != 200) {
            $errorMessage="Failed to upload file to drive";
            if (curl_errno($curl)) {
                $errorMessage = curl_error($curl);
            }
            throw new Exception('Error ' . $responseCode . ': ' . $errorMessage);
        }
        curl_close($curl);
        return $curlResponse['id'];
    }

    public function addFileMeta($accessToken, $googleDriveFileId, $fileMeta)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, Config::GOOGLE_DRIVE_FILE_META_URI . $googleDriveFileId);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Authorization: Bearer ' . $accessToken
        ));
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fileMeta));
        $curlResponse = json_decode(curl_exec($curl), true);
        $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        if ($responseCode != 200) {
            $errorMessage="Failed to add file metadata";
            if (curl_errno($curl)) {
                $errorMessage = curl_error($curl);
            }
            throw new Exception('Error ' . $responseCode . ': ' . $errorMessage);
        }
        curl_close($curl);

        return $curlResponse;
    }
}
?>

Kelas model PHP untuk membuat kueri dan parameter untuk menyisipkan, membaca, dan memperbarui laporan data file

Kelas model PHP ini mendefinisikan fungsi untuk melacak log database untuk file yang diunggah.

Dalam panggilan balik, ia menulis ID file Google Drive dengan referensi ke ID terakhir yang dimasukkan dalam sesi.

lib/FileModel.php

<?php
require_once __DIR__ . '/DataSource.php';

class FileModel extends DataSource
{

    function insertFile($fileBaseName)
    {
        $query = "INSERT INTO google_drive_upload_response_log (file_base_name, create_at) VALUES (?, NOW())";
        $paramType="s";
        $paramValue = array(
            $fileBaseName
        );
        $insertId = $this->insert($query, $paramType, $paramValue);
        return $insertId;
    }

    function getFileRecordById($fileId)
    {
        $query = "SELECT * FROM google_drive_upload_response_log WHERE id = ?";
        $paramType="i";
        $paramValue = array(
            $fileId
        );
        $result = $this->select($query, $paramType, $paramValue);
        return $result;
    }

    function updateFile($googleFileId, $fileId)
    {
        $query = "UPDATE google_drive_upload_response_log SET google_file_id=? WHERE id=?";
        $paramType="si";
        $paramValue = array(
            $googleFileId,
            $fileId
        );
        $this->update($query, $paramType, $paramValue);
    }
}
?>

File ini adalah class PHP Util sederhana yang saat ini hanya memiliki fungsi redirection.

Kami dapat meningkatkan fungsi ini dengan menambahkan lebih banyak alat. Misalnya, ia dapat memiliki dekode JSON untuk mengonversi respons cURL ke array.

lib/Util.php

<?php

class Util
{
    function redirect($type, $message)
    {
        $_SESSION['responseMessage'] = array(
            'messageType' => $type,
            'message' => $message
        );
        header("Location: index.php");
        exit();
    }
}
?>

langkah-langkah instal

Sebelum menjalankan contoh ini untuk mengunggah file ke Google Drive, selesaikan langkah-langkah berikut. Ini memungkinkan lingkungan pengembangan disiapkan dengan pengaturan dan sumber daya yang diperlukan.

  1. Konfigurasikan detail basis data dengan lib/DataSource.php. Kode sumber disertakan dalam file ini.
  2. Kunci Google API dengan lib/Config.php. Juga, berikan domain dan subfolder untuk mengatur panggilan balik ke AUTHORIZED_REDIRECT_URI.
  3. Masukkan skrip SQL berikut ke database target Anda.

sql/struktur.sql

--
-- Table structure for table `google_drive_upload_response_log`
--

CREATE TABLE `google_drive_upload_response_log` (
  `id` int NOT NULL,
  `google_file_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `file_base_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

--
-- Indexes for dumped tables
--

--
-- Indexes for table `google_drive_upload_response_log`
--
ALTER TABLE `google_drive_upload_response_log`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `google_drive_upload_response_log`
--
ALTER TABLE `google_drive_upload_response_log`
  MODIFY `id` int NOT NULL AUTO_INCREMENT;

Unduh

Kembali ke atas


Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.