دیجی اسکریپت

آپلود فایل بر روی گوگل درایو به وسیله ی PHP | دیجی اسکریپت

آپلود فایل بر روی گوگل درایو به وسیله ی PHP
[ad_1]

این اموزش رو به خاطر درخواست یکی از دوستان عزیز بازدید کننده میزاریم , در اینجا میخوایم نحوه ی اپلود فایل ها بر روی گوگل درایو با استفاده از PHP رو براتون شرح بدیم. میتونید پیش نمایش چیزی که در انتها میزاریم رو از اینجا(کلیک کنید) ببینید همچنین میتونید کدها رو از انتهای همین اموزش دانلود کنید و استفاده کنید. ببخشید سرم انقدر این روزا شلوغ هست که وقت نشد گرافیک خوشکلی براش طراحی کنم 😐

اگه درون گوگل حساب کاربری دارید میتونید از امکانات گوگل استفاده کنید 😀 یکی از این امکانات گوگل درایو است. گوگل درایو یک فضا بر روی اینترنت است که گوگل در اختیار شما قرار میده تا بتونید فایل های خودتون رو توش اپلود کنید. فرستادن فایل بر روی گوگل درایو یا همون اپلود کردن فایل رو میشه با PHP نیز انجام داد. فایده ی این کار چیه؟

شما میتونید یک اسکریپت یا برنامه به زبان PHP بنویسید که روزانه از فایل های شما بکاپ بگیره و روی گوگل درایو قرار بده! یا اینکه اگه سایت دارید و فضای سرور شما کم هست میتونید از گوگل درایو کمک بگیرید و فایل های خودتون رو روی گوگل درایو قرار بدید , این کار بیشتر برای سایت هایی که فایل های مالتی مدیا مثل موزیک یا فیلم دارن مفید است. خب دیگه از توضیح پرهیز میکنیم و میریم که نحوه ی کار با گوگل درایو به همراه PHP رو توضیح بدیم , مراحل کار به صورت زیر خواهد بود:(دقت کنید گوگل ایران رو تحریم کرده و اگر صفحاتی گه میگیم براتون باز نشد باید از نرم افزارهایی برای رد کردن تحریم استفاده کنید تا بتوانید وارد صفحاتی که میگیم بشید.)

  • در ابتدا از این قسمت(کلیک کنید) یک پروژه ایجاد کنید یا یکی از پروژه های خودتون رو انتخاب کنید سپس بر روی دکمه ی continue کلیک کنید و به قسمت credentials برید. در صورتی که یک پروژه ایجاد میکنید مراحل زیر رو انجام بدید در غیر این صورت با انتخاب یکی از پروژه های موجود نیاز به مراحل زیر نیست :
  1. منو را بر روی create project قرار دهید(به صورت پیش فرض تنظیم شده است)
  2. اگر صفحه ای با عنوان Add credentials to your project برای شما باز شد بر روی cancel کلیک کنید.
  3. در اخر به قسمت credentials برید.

عمل هایی که در بالا برای ایجاد پروژه انجام دادید به صورت تصاویر زیر هستند:

بعد از ایجاد یا انتخاب پروژه صفحه ای جدید برای شما لود میشود که چیزی شبیه صفحه ی زیر خواهد بود:

  • در بالای صفحه بر روی تب OAuth consent screen کلیک کنید و اگر ادرس ایمیل و نام محصول (product name) برابر با چیزی که مورد نظر شما است نبود ان را تغییر داده و سپس دکمه ی save را بزنید تا ذخیره شود. چیزی شبیه تصویر زیر :

  • به تب Credentials و بر روی دکمه ی Create credentials کلیک کنید و OAuth client ID رو انتخاب کنید.

  • در صفحه ای که باز شد قسمت web application رو انتخاب کنید , با انتخاب شدن آن چند input برای شما ایجاد میشود که یکی مربوط به نام اپلیکیشن شماست و میتونید تغییرش بدید و نام دلخواه خودتون رو بنویسید. چند input دیگه وجود دارند که مربوط به لینک redirect است , فعلا به این قسمت ها دست نزنید و دکمه ی create رو بزنید تا یک OAuth client ID برای شما ایجاد بشه. سپس اگر دیالوگ باکس شبیه شکل زیر براتون باز شد دکمه ی ok اون رو بزنید.

  • حالا به قسمت dashboard برید و بر روی Enable API کلیک کنید و سپس از قسمت google aps API قسمت drive API را انتخاب کنید و در اخر دکمه ی enable را بزنید تا api گوگل درایو در پروژه ی شما فعالسازی شود , عملیاتی که گفته شد طبق تصاویر زیر هستند:

  • حالا دوباره به تب credentials برید و از لیستی که مربوط به OAuth client IDs Name است با توجه به نامی که در مرحله ی قبل انتخاب کرده بودید بر روی علامت دانلود کلیک کنید تا یک فایل به صورت json به شما داده بشه. این فایل رو دانلود کنید و سپس یک فولدر با نام دلخواه ایجاد کنید و این فایل رو به نام client_secret.json تغییر بدید و درون فولدری که ایجاد کردید قرار بدید.

  • حالا نیاز به کتابخونه ی google داریم تا بتونیم از امکاناتش استفاده کنیم. میتونید اخرین ورژن از اون اینجا(کلیک کنید) پیدا کنید و دانلود کنید. بعد از اینکه دانلودش کردید فایل های اون رو درون پوشه (فولدر) که در مرحله ی قبل ایجاد کردید از حالت زیپ خارج کنید. محتوای فایل چیزی شبیه تصویر زیر خواهد بود:

حالا یک فایل php ایجاد میکنیم که قراره دستوراتی توش بنویسیم که عمل اپلود فایل ها بر روی گوگل درایو رو انجام بده. من این فایل رو upload_large_files.php نام گذاری میکنم اما شما میتونید هر نام دلخواهی که دوسدارید براش بزارید. تا الان ساختار فایل های ما چیز شبیه زیر خواهد بود:

خب حالا میریم سراغ برنامه نویسی و استفاده از فایل هایی که تا الان دانلود کردیم 😀

از الان به بعد از دستوری که بنویسیم درون فایل upload_large_files.php قرار میگیره , این دستورات عمل اپلود کردن روی گوگل درایو رو انجام میدن , برای اپلود فایل بر روی گوگل درایو نیاز داریم به صورت مراحل زیر عمل کنیم:

۱- افزودن فایل های کتابخونه ی google به برنامه : شما برای اینکه بتونید از سرویس های گوگل استفاده کنید باید فایل autoload که در پوشه ی vendor قرار داره رو از کتابخونه ی google-api-php-client که دانلودش کردیم به صفحه خودتون اظافه کنید , چیزی شبیه کد زیر :

<?php
include_once 'google-api-php-client-2.1.3/vendor/autoload.php';
?>

۲- ایجاد کردن کلاینت : کلاینت به عنوان کاربری شناخته میشه که میخواد از سرویس های گوگل استفاده کنه. برای ایجاد کلاینت خطوط زیر رو به کدمون اظافه میکنیم:

<?php
include_once 'google-api-php-client-2.1.3/vendor/autoload.php';
$oauth_credentials="client_secret.json";
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
//create a google client
$client = new Google_Client();
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
?>

در دستورات بالا درون متغیر oauth_credentials ادرس فایل secret_client.json رو که از گوگل دانلود کردیم قرار میدیم. همچنین متغیر redirect_uri حاوی ادرسی خواهد بود که کاربران بعد از لاگین کردن در گوگل به اون صفحه برگردانده میشن. من در اینجا از php استفاده کردم تا ادرس همین صفحه ای که داریم توش کدنویسی میکنیم رو بدست بیارم و اون رو درون متغیر redirect_uri قرار بدم. شما اگه میدونید ادرس فایلتون توی سرور کجا هست میتونید ادرس دقیقش رو قرار بدید و دیگه از php استفاده نکنید (پردازش الکی انجام ندید). ادرس فایلی که میخواید بعد از لاگین کردن کاربران به اونجا ریدایرکت بشه (در اینجا فایلی که میخوایم بهش ریدایرکت بشه همون upload_large_files.php است) رو کپی کنید سپس طبق تصویر زیر در قسمت OAuth client IDs بر روی دکمه ی edit (شبیه یک مداد است و در کنار دکمه ای که برای دانلود فایل json استفاده کردید قرار دارد) کلیک کنید و ادرسی که کپی کردید رو در قسمت Authorized redirect URIs وارد کنید و save بزنید.

نکته : دقت کنید اگه فعلا روی localhost کار میکنید ادرسی که روی localhost هست رو در Authorized redirect URIs وارد کنید اما بعدا که فایل ها رو روی سرور قرار میدید ادرس رو با توجه به سرور باید دوباره تغییر بدید و ذخیره کنید.

۳- ایجاد کردن سرویس گوگل درایو : بعد از اینکه یک کلاینت ایجاد کردید با استفاده از این کلاینت میتونید از سرویس هایی که گوگل ارائه میده استفاده کنید. یکی از این سرویس ها گوگل درایو هست! برای استفاده از سرویس گوگل درایو باید ابتدا یک سرویس از نوع google drive ایجاد کنیم , کدهای ما به صورت زیر خواهند شد:

<?php
include_once 'google-api-php-client-2.1.3/vendor/autoload.php';
$oauth_credentials="client_secret.json";
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
//create a google client
$client = new Google_Client();
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
//create a google drive service that a client can use it
$service = new Google_Service_Drive($client);
?>

۴- ایجاد لینک لاگین برای کاربر و بررسی لاگین بودن در گوگل: حالا نیاز داریم تا client که در مرحله های قبل ایجاد کردیم رو درون گوگل لاگین کنیم. توسط متد createAuthUrl میتونیم یک لینک برای لاگین کردن یوزر ایجاد کنیم , بعد از اینکه کاربر بر روی لینک کلیک کنه و لاگین کنه دوباره به صفحه ای که الان توش هستیم برمیگرده و یک token توسط گوگل برای ما ارسال میشه که به وسیله ی اون میتونیم کارهای خودمون رو انجام بدیم. این token رو میگیرم و درون session قرار میدیم و سپس یه دستور redirect مینویسیم تا ادرس url درون مرورگر به ادرس پروژه ی ما تغییر کنه و token از درون نوار ادرس مرورگر نا پدید بشه.

<?php
include_once 'google-api-php-client-2.1.3/vendor/autoload.php';
$oauth_credentials="client_secret.json";
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
//create a google client
$client = new Google_Client();
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
//create a google drive service that a client can use it
$service = new Google_Service_Drive($client);
if (isset($_GET['code'])){
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
$client->setAccessToken($token);
// store in the session also
$_SESSION['upload_token'] = $token;
// redirect back to the example
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
exit;
}
// set the access token as part of the client
if (!empty($_SESSION['upload_token'])){
$client->setAccessToken($_SESSION['upload_token']);
if ($client->isAccessTokenExpired()){
unset($_SESSION['upload_token']);
}
}else{
$authUrl = $client->createAuthUrl();
}
?>

۵- در مرحله ی اخر نیز کدهای مربوط به اپلود فایل رو مینویسیم: برای اپلود فایل باید از سرویس Google_Service_Drive_DriveFile برای ایجاد فایل و از Google_Http_MediaFileUpload برای اپلود فایل استفاده کنیم. به کدهای زیر دقت کنید:

<?php
session_start();
include_once 'vendor/autoload.php';
$oauth_credentials="client_secret.json";
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
//create a google client
$client = new Google_Client();
$guzzleClient = new GuzzleHttpClient(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), ));
$client->setHttpClient($guzzleClient);
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
//create a google drive service that a client can use it
$service = new Google_Service_Drive($client);
if (isset($_GET['code'])){
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
$client->setAccessToken($token);
// store in the session also
$_SESSION['upload_token'] = $token;
// redirect back to the example
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
exit;
}
// set the access token as part of the client
if (!empty($_SESSION['upload_token'])){
$client->setAccessToken($_SESSION['upload_token']);
if ($client->isAccessTokenExpired()){
unset($_SESSION['upload_token']);
}
}else{
$authUrl = $client->createAuthUrl();
}
function readChunkFile ($handle, $chunkSize){
$byteCount = 0;
$giantChunk = "";
while (!feof($handle)){
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
$chunk = fread($handle, 8192);
$byteCount += strlen($chunk);
$giantChunk .= $chunk;
if ($byteCount >= $chunkSize){
return $giantChunk;
}
}
return $giantChunk;
}
//If we're signed in then lets try to upload our file.
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $client->getAccessToken()) {
$testFile='a.jpg';
$file = new Google_Service_Drive_DriveFile();
$file->name = "Big File";
$chunkSizeBytes = 1 * 1024 * 1024;
// Call the API with the media upload, defer so it doesn't immediately return.
$client->setDefer(true);
$request = $service->files->create($file);
// Create a media file upload to represent our upload process.
$media = new Google_Http_MediaFileUpload(
$client,
$request,
mime_content_type($testFile),
null,
true,
$chunkSizeBytes
);
$media->setFileSize(filesize($testFile));
// Upload the various chunks. $status will be false until the process is
// complete.
$status = false;
$handle = fopen($testFile, "rb");
while (!$status && !feof($handle)) {
// read until you get $chunkSizeBytes from $testFile
// fread will never return more than 8192 bytes if the stream is read buffered and it does not represent a plain file
// An example of a read buffered file is when reading from a URL
$chunk = readChunkFile($handle, $chunkSizeBytes);
$status = $media->nextChunk($chunk);
}
// The final value of $status will be the data from the API for the object that has been uploaded.
$result = false;
if ($status != false) {
$result = $status;
}
fclose($handle);
}
?>
<div class="box">
<?php if (isset($authUrl)): ?>
<div class="request">
<a class='login' href='<?= $authUrl ?>'>ابتدا از اینجا درون گوگل درایو خود لاگین کنید</a>
</div>
<?php elseif($_SERVER['REQUEST_METHOD'] == 'POST'): ?>
<div class="shortened">
<p>Your call was successful! Check your drive for this file:</p>
<p><a href="https://drive.google.com/open?id=<?= $result->id ?>" target="_blank"><?= $result->name ?></a></p>
</div>
<?php else: ?>
<form method="POST">
<input type="submit" value="Click here to upload a large (20MB) test file" />
</form>
<?php endif ?>
</div>

در دستورات بالا من یک دکمه قرار دادم که وقتی روی اون کلیک کنید اپلود انجام میشه. این دکمه چون درون form قرار داره متد post رو ارسال میکنه و منم از if استفاده کردم تا وقتی که دکمه فشرده میشه عمل اپلود انجام بشه. شما میتونید از دکمه استفاده نکنید و یکراست اپلود رو انجام بدید. دقت کنید فایلی که قراره  اپلود بشه ادرسش درون متغیر testFile قرار میگیره , من در اینجا یک عکس با نام a.jpg رو اپلود میکنم اما شما میتونید هرچیزی که میخواید رو اپلود کنید.

بعد از اپلود شدن ادرس فایل که اپلود میشه به شما داده میشه میتونید روی اون کلیک کنید و فایل رو درون گوگل درایو ببینید 😀

مشکلات احتمالی و روش رفع ان:

مشکل فعال نبودن finfo و یافت نشدن تابع mime_content_type : دوستان عزیز دقت کنید من در اینجا برای مشخص کردن mime type فایل ها از تابع mime_content_type استفاده کردم , برای استفاده از این تابع باید finfo روی سرور شما فعال باشه. به صورت پیش فرض روی لوکال هاست finfo فعال نیست و شما نیاز دارید تا فایل php.ini رو باز کنید و extension=php_fileinfo.dll رو پیدا کنید و سمی کالن یا نقطه ویرگول اول اون رو حذف کرده و دوباره ذخیره کنید سپس وب سرور خودتون رو دوباره راه اندازی کنید تا مشکل رفع بشه, اگه نمیخواید از این تابع استفاده کنید میتونید نوع mime type رو به صورت دستی وارد کنید مثلا برای تصویری که jpg است به صورت image/jpeg خواهد بود.

مشکل خطای curl : ممکنه با خطایی به صورت زیر مواجه بشید

اگه با این خطا مواجه شدید برای رفع اون باید از اینجا(کلیک کنید) یا از انتهای همین پست فایل cacert.pem رو دانلود کنید از حالت فشرده خارج کنید سپس فایل cacert.pem را با توجه به محل نصب شدن وب سرور درون مسیری شبیه C:xamppphpextrassslcacert.pem قرار بدید سپس به فایل php.ini برید و خط زیر را درون ان اظافه کنید , میتونید به انتهای فایل php.ini برید و اون رو در انتهای این فایل قرار بدید و ذخیره کنید و وب سرور رو دوباره راه اندازی کنید.

همچنین میتونید از روش بالا استفاده نکنید و با تغییر دادن کدهای خودتون مشکل رو رفع کنید:

<?php
//create a google client
$client = new Google_Client();
$guzzleClient = new GuzzleHttpClient(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), ));
$client->setHttpClient($guzzleClient);
$client->setAuthConfig($oauth_credentials);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/drive");
?>

کدها رو باید به صورت بالا در قسمت ایجاد کردن client درون فایل upload_large_files تغییر بدید.

لینک پیش نمایش چیزی که تا الان ساختیم رو میتونید از اینجا(کلیک کنید) ببینید همچنین میتونید سورس کدها رو از انتهای همین پست دانلود کنید و مورد استفاده قرار بدید. امیدوارم که این اموزش مورد پسند دوستان واقع شده باشه.

منابعی که استفاده کردم به صورت لیست زیر هستند:

  1. صفحه رسمی گوگل برای استفاده از گوگل درایو
  2. لیست اخرین api گوگل برای دانلود
  3. نحوه فعالسازی fileinfo در xampp

دوستانی که مشکل یا سوال دارند از انتهای همین پست مطرح کنند تا بهشون پاسخ داده بشه. همچنین اگه ایده ای دارید میتونید اون رو پیاده سازی کنید و برای من ارسال کنید تا توی سایت با نام خودتون انتشار داده بشه. فقط دقت کنید ایده ها باید بزرگتر از چیزی باشن که به سادگی توی نت پیدا بشه 😀 چیزهای ناب بسازید!!!! موفق باشید.

برای دانلود سورس کد این اموزش به همراه کتابخونه ی google بر روی دکمه ی زیر کلیک کنید.

دانلود سورس کد این اموزش حجم حدود ۶٫۵ مگابایت است , حجم بالای فایل به خاطر کتابخونه ی google است.

[ad_2]

لینک منبع مطلب

ارسال دیدگاه جدید

به نکات زیر توجه کنید

  • نظرات شما پس از بررسی و تایید نمایش داده می شود.
  • لطفا نظرات خود را فقط در مورد مطلب بالا ارسال کنید.