Drive Api Dosya İndirme

Google drive api’yi kullanarak listeleme işlemi yaptımştık. Şimdi drive dosyalarımızı indirelim. Google Drive içerisinde bir çok farklı uzantıda dosyamız bulunabilir. Google drivedan dosya indirmek için, Dosya indirmek ve  Google Döküman dosyası indirmek  için 2 farklı kod sunmuşlar. Sanırım Google dökümanları dönüştürerekte indirme yapabildiğimiz için böyle bir seçenek sunulmuş olmalı.

Drive apisinde listeleme işleminde olduğu gibi indirme yapabilmek içinde oAuth 2.0 yetkilendirmesini kullanmamız gerekir. Drive içerisindeki dosyalarımız herkese açık olduğu gibi bize özel dosyalar da barındıracağı için oAuth 2.0 izni gerekmektedir. Bu yetkilendirmeyi alarak access Token anahtarını üretmiş oluruz ve ardından Drive Apisini kullanarak dosyalarımızı kolay bir şekilde indirebiliriz. İndirme işlemini yapmak için listeleme yaptığımızda elde ettiğimiz id’yi  File Id olarak belirleyip dosya indirme işlemini kolay bir şekilde yapıyoruz.


Öncelikle bu apiyi kullanmamız için apiyi etkinleştirmemiz gerekiyor, OAuth 2.0 istemci kimliğine sahip olmanız ve Google Client Kütüphanelerini edinmiş olmamız gerekiyor bilgilendirme kategorisinin altındaki makalemizde Php ile OAuth 2.0 kullanma başlıklı makalemizde OAuth nasıl alındığını ve Kütüphaneleri nasıl yüklediğimiz anlatmıştık. Buraya tıklayarak Php ile OAuth 2.0 kullanımı makalesine gidebilir veya Genel Bilgilendirme kategorisine göz atabilirsiniz.

GOOGLE DRİVE APİSİNİ KULLANMAK İÇİN
  • console.developers.google.com’da Projemizi oluşturduk
  • Kullanacağımız apiyi etkinleştirdik
  • OAuth istemci kimliğini oluşturduk ve oluşturuken sitemize gerekli izinleri verdik.
  • OAuth istemci kimliğinin json dosyasını indirdik
  • GitHub dan Google Client Api kütüphanesini indirdik
  • Composer yardımıyla Vendor  klasörümüzü de edindik

Eğer bu işlemleri yapmadıysanız Buraya Tıklayarak OAuth Makalemi inceleyiniz. Bu işlemleri yaptıksak alt yapı hazır demektir şimdi aşağıdaki dosyalarımızı oluşturalım

  • index.php
  • oauth2callback.php

Şimdi fonksiyonumuza gelecek olursak Drive servisinden ürettiğimiz $drive değişkenine bakalım. Bu şekilde kullanarak drive üzerinde bulunan dosyalarımızın bilgilerini ayrıntılı şekilde $files değişkenine dizi olarak atadık.

$files = $drive->files->listFiles(array())->getFiles();

index.php dosyasının içerisine

<?php
error_reporting(0);
require_once __DIR__.'/google_api/vendor/autoload.php';
include 'ayar.php';
session_start();

function pr($val)
{
 echo "<pre>";
 print_r($val);
 die();
}

function downloadFile($service, $fileId) {

 $file = $service->files->get($fileId, array('fields' => 'id,size,name,mimeType'));
 $fileName = $file['name'];
 $fileType = $file['mimeType'];
 $fileSize = $file['size'];


 if(strrpos($fileType, 'google-apps')=="")
 {
 $response = $service->files->get($fileId, array(
 'alt' => 'media'));
 $content = $response->getBody()->getContents();
 }else 
 {
 $response = $service->files->export($fileId, 'application/pdf', array(
 'alt' => 'media'));
 $content = $response->getBody()->getContents();
 $fileName.='.pdf';
 echo $fileName;
 die();
 }

 //$test = $service->files->get($fileId, ['fields' => 'id','size']);

 header('Content-Description: File Transfer');
 header('Content-Type: application/octet-stream');
 header('Content-Disposition: attachment; filename='.basename($fileName));
 header('Content-Transfer-Encoding: binary');
 header('Expires: 0');
 header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
 header('Pragma: public');
 header('Content-Length: ' . $fileSize);
 ob_clean();
 flush();
 print_r($content);
 exit;
 /*if(!file_exists ( "download" )){
 mkdir("download");

 }
 $fp = fopen("download\\".$fileName,'w');
 fwrite($fp, $content);
 fclose($fp);
 */

}

$client = new Google_Client();
$client->setAuthConfig('jsondrive.json');
$client->addScope(Google_Service_Drive::DRIVE);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
 $client->setAccessToken($_SESSION['access_token']);
 $service = new Google_Service_Drive($client);
 $files = $service->files->listFiles();

 if($_GET['type']=='list')
 {
 foreach ($files as $key => $value) {
 echo 'Name : '.$value['name'].' ID : '.$value['id'].'<br>';
 }
 die();
 }

 if(isset($_GET['fileKey']))
 {
 

 $sql = "SELECT * FROM data WHERE fileKey='".$_GET['fileKey']."'";
 $result = $conn->query($sql);

 if ($result->num_rows > 0) {
 
 while($row = $result->fetch_assoc()) {
 downloadFile($service,$row['fileId']);
 break;
 }

 } else {
 echo "0 results";
 }

 }

 

 $sql = "SELECT * FROM data";
 $result = $conn->query($sql);

 if ($result->num_rows > 0) {
 // output data of each row
 while($row = $result->fetch_assoc()) {
 echo '<a href="?fileKey='.$row['fileKey'].'">'.$row['fileName'].'</a><br>';
 }
 } else {
 echo "0 results";
 }
 
}

else {
 $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/drive/oauth2callback.php';
 header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

oauth2callback.php dosyasını içerisine

<?php
require_once __DIR__.'/google_api/vendor/autoload.php';
session_start();

$client = new Google_Client();
$client->setAuthConfigFile('jsondrive.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/api/drive/oauth2callback.php');
$client->addScope(Google_Service_Drive::DRIVE);

if (! isset($_GET['code'])) {
 $auth_url = $client->createAuthUrl();
 header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
 $client->authenticate($_GET['code']);
 $_SESSION['access_token'] = $client->getAccessToken();
 $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/api/drive/';
 header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

Not : Kodlar içerisinde veritabanı bağlantısı yapmıştım. Veritabanından dosya id sini çekerek çektiği dosyayı indirmekteydi. Biraz yoğun olduğum için yazdığım kodları direk attım içerisinden mysql kodlarını silip get kısımlarını düzenlemeniz gerekmektedir. Vaktim olduğunda kodları güncelleyeceğim.