2016-10-13 12 views
5

में फ़ाइलों को डाउनलोड करना मैं PHP का उपयोग कर Google ड्राइव एपीआई v3 के लिए डाउनलोड प्रवाह को समझने की कोशिश कर रहा हूं। API v2 का उपयोग करते हुए एक फ़ाइल मैं डाउनलोड करने के लिए:Google ड्राइव एपीआई v3 - PHP

  • फ़ाइल मेटाडाटा
  • downloadUrl पैरामीटर प्रयुक्त फाइल करने के लिए एक सीधा लिंक प्राप्त करने के लिए मिल गया है, यह करने के लिए एक OAuth टोकन जुड़ा हुआ है और उस के लिए एक GET अनुरोध कर दिया।

API v3 का उपयोग करते हुए इस पदावनत किया गया है प्रकट होता है, और docs आप "alt" => "media" की एक सरणी पैरामीटर फाइल खुद के बजाय मेटाडाटा पाने के लिए के साथ डिस्क सेवा पर files->get() फोन के अनुसार।

और उनके उदाहरण था:

$fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M'; 
$content = $driveService->files->get($fileId, array(
'alt' => 'media')); 

मैं समझ है कि यह कैसे काम करता है, हालांकि और कोड के माध्यम से trawled है समस्या हो रही है, लेकिन यह बहुत अधिक जानकारी नहीं दी।

जब आप get() पर कॉल करते हैं, तो वास्तव में $content में क्या होता है? क्या यह फ़ाइल की सामग्री है (इस मामले में बड़ी फ़ाइलों से निपटने में यह परेशानी प्रतीत होता है - निश्चित रूप से आप स्मृति से बाहर हो जाएंगे ?!) या यह कुछ प्रकार का स्ट्रीम संदर्भ है जिसे मैं fopen पर कॉल कर सकता हूं? मैं इस फ़ाइल को डिस्क पर कैसे सहेजूं?

प्रलेखन वास्तव में किसी भी विवरण में नहीं जाता है कि जब आप एपीआई कॉल करते हैं तो क्या होता है, यह कहता है कि यह फ़ाइल डाउनलोड करता है?

उत्तर

11

मैंने थोड़ा प्रयोग करने के बाद इसे समझ लिया।

डॉक्स में विनिर्दिष्ट जब आप alt=>media पैरामीटर के साथ get() विधि कॉल आप अंतर्निहित HTTP प्रतिसाद जो एक Guzzle response object (जाहिरा तौर पर के रूप में क्लाइंट लाइब्रेरी यह परिवहन अंतर्निहित है के लिए Guzzle उपयोग करता है) है मिलता है।

वहां से आप $response->getStatusCode() जैसे किसी भी Guzzle प्रतिक्रिया विधि को कॉल कर सकते हैं या आप वास्तविक फ़ाइल सामग्री की स्ट्रीम प्राप्त कर सकते हैं।

अगर वे कहीं कहीं दस्तावेज कर चुके हों तो मददगार होगा!

संपादित करें: यहां कोई मोटा उदाहरण है यदि कोई और फ़ाइल को सहेजने के तरीके से फंस जाता है।

<?php 

date_default_timezone_set("Europe/London"); 
require_once 'vendor/autoload.php'; 

// I'm using a service account, use whatever Google auth flow for your type of account. 

putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account/key.json'); 
$client = new Google_Client(); 
$client->addScope(Google_Service_Drive::DRIVE); 
$client->useApplicationDefaultCredentials(); 

$service = new Google_Service_Drive($client); 

$fileId = "0Bxxxxxxxxxxxxxxxxxxxx"; // Google File ID 
$content = $service->files->get($fileId, array("alt" => "media")); 

// Open file handle for output. 

$outHandle = fopen("/path/to/destination", "w+"); 

// Until we have reached the EOF, read 1024 bytes at a time and write to the output file handle. 

while (!$content->getBody()->eof()) { 
     fwrite($outHandle, $content->getBody()->read(1024)); 
} 

// Close output file handle. 

fclose($outHandle); 
echo "Done.\n" 

?> 
+1

धन्यवाद, मुझे उस अतिरिक्त जानकारी की आवश्यकता थी, लेकिन 1024 ब्लॉक में पढ़ने के किसी कारण से मेरे लिए काम नहीं किया। मैंने थोड़ी देर के बिना कोड को fwrite ($ outHandle, $ content-> getBody()) में बदल दिया और यह काम किया। –

+1

धन्यवाद !! बहुत उपयोगी। –

संबंधित मुद्दे