Guzzle

2013-06-05 12 views
16

का उपयोग कर दूरस्थ फ़ाइल कॉपी करें मैं अपने सर्वर पर एक दूरस्थ फ़ाइल (छवि पीएनजी, जीआईएफ, जेपीजी ...) की प्रतिलिपि बनाने की कोशिश कर रहा हूं। मैं Guzzle का उपयोग करता हूं क्योंकि मुझे कभी-कभी copy() के साथ 404 मिलते हैं, भले ही फ़ाइल मौजूद है और मुझे मूल लेख भी करना है। यह स्क्रिप्ट क्रॉन जॉब द्वारा ट्रिगर किए गए कमांड में लॉन्च की गई एक लंबी स्क्रिप्ट के भीतर है। मैं गुज़ल के लिए काफी नया हूं और मैंने सफलतापूर्वक छवि की प्रतिलिपि बनाई है लेकिन मेरी फाइलों में गलत माइम प्रकार है। मुझे यहाँ कुछ गलत करना होगा। कृपया मुझे ऐसा करने का एक अच्छा तरीका सुझाएं (कॉपी और माइम प्रकार की जांच की विफलता/विफलता सहित)। अगर फ़ाइल में कोई माइम प्रकार नहीं है तो मैं विवरण सूचनाओं के साथ एक त्रुटि पॉप अप करूंगा।Guzzle

यहाँ कोड है:

$remoteFilePath = 'http://example.com/path/to/file.jpg'; 
$localFilePath = '/home/www/path/to/file.jpg'; 
try { 
    $client = new Guzzle\Http\Client(); 
    $response = $client->send($client->get($remoteFilePath)->setAuth('login', 'password')); 
    if ($response->getBody()->isReadable()) { 
     if ($response->getStatusCode()==200) { 
      // is this the proper way to retrieve mime type? 
      //$mime = array_shift(array_values($response->getHeaders()->get('Content-Type'))); 
      file_put_contents ($localFilePath , $response->getBody()->getStream()); 
      return true; 
     } 
    } 
} catch (Exception $e) { 
    return $e->getMessage(); 
} 

जब मैं यह मेरी माइम प्रकार के लिए सेट है कर आवेदन/x-खाली

यह भी तरह स्थिति स्वचालित रूप से होगा 200 guzzle से अलग है जब लग रहा है एक अपवाद फेंक दो। मैं इस व्यवहार को कैसे रोक सकता हूं और खुद को स्थिति की जांच कैसे कर सकता हूं ताकि मैं कस्टम त्रुटि संदेश कर सकूं?

संपादित करें: यह guzzle 3.X के लिए था अब यह कैसे आप

$client = new \GuzzleHttp\Client(); 
$client->get(
    'http://path.to/remote.file', 
    [ 
     'headers' => ['key'=>'value'], 
     'query' => ['param'=>'value'], 
     'auth' => ['username', 'password'], 
     'save_to' => '/path/to/local.file', 
    ]); 

या guzzle धारा का उपयोग कर (guzzle 6 के साथ साथ ही काम करता है) guzzle वी 4.x का उपयोग कर ऐसा कर सकते हैं है:

use GuzzleHttp\Stream; 

$original = Stream\create(fopen('https://path.to/remote.file', 'r')); 
$local = Stream\create(fopen('/path/to/local.file', 'w')); 
$local->write($original->getContents()); 

यह बहुत अच्छा लग रहा है। Guzzle 4 का उपयोग करते समय क्या बेहतर/उचित समाधान है?

उत्तर

21

आपका कोड एक बड़ा सौदा सरल बनाया जा सकता है। नीचे मेरा उदाहरण कोड सीधे फाइल सिस्टम को प्रतिक्रिया के शरीर को स्ट्रीम करेगा।

<?php 

function copyRemote($fromUrl, $toFile) { 
    try { 
     $client = new Guzzle\Http\Client(); 
     $response = $client->get($fromUrl) 
      ->setAuth('login', 'password') // in case your resource is under protection 
      ->setResponseBody($toFile) 
      ->send(); 
     return true; 
    } catch (Exception $e) { 
     // Log the error or something 
     return false; 
    } 
} 

जब मैं यह मेरी माइम प्रकार के लिए आवेदन/x-खाली

एक फाइल सिस्टम माइम प्रकार सेट कर दिया जाता है?

यह भी ऐसा लगता है कि 200 गुज़ल से स्थिति अलग होने पर स्वचालित रूप से अपवाद फेंक दिया जाएगा। मैं इस व्यवहार को कैसे रोक सकता हूं और खुद को स्थिति की जांच कैसे कर सकता हूं ताकि मैं कस्टम त्रुटि संदेश कर सकूं?

गुज़ल 4xx और 5xx जैसे खराब प्रतिक्रियाओं के लिए अपवाद फेंक देगा। इसे अक्षम करने की कोई आवश्यकता नहीं है। बस एक अपवाद पकड़ो और वहां त्रुटि से निपटें। पोस्ट के साथ इस पर

+0

में आपकी आवश्यकताएं बहुत धन्यवाद!मैं कोशिश करूँगा मुझे आशा है कि यह माइम प्रकार (मूल माइम प्रकार) को बढ़ावा देता है। – Spir

+0

किसी प्रकार के माइम-प्रकार का उपयोग करने के लिए डिस्क पर फ़ाइल को अपडेट करने के लिए आपको अपने अंत में कुछ करना होगा। मैंने इस बारे में कभी नहीं सुना है। –

+0

नहीं, मेरा मतलब यह था कि मैं जिस तरह से कर रहा था वह माइम प्रकार को तोड़ दिया/ढीला कर दिया। आपका समाधान ठीक काम करता है। सहायता के लिए धन्यवाद। – Spir

10

देखो:

$myFile = fopen('path/to/file', 'w') or die('Problems'); 
$client = new \Guzzle\Service\Client(); 
$request = $client->post('https://www.yourdocumentpage.com', array(), ['pagePostField' => 'data'], ['save_to' => $myFile]); 
$client->send($request); 
fclose($myFile); 
यहाँ

आप

$myFile = fopen('path/to/file', 'w') or die('Problems'); 
$client = new \GuzzleHttp\Client(); 
$request = $client->get('https://www.yourdocumentpage.com', ['save_to' => $myFile]); 

हो और यहाँ आप की जरूरत नहीं है अपने "पोस्ट"

और साथ के अनुरोध भेजना होगा अनुरोध भेजें, और here आपको बहुत सारे दस्तावेज मिलेंगे, आपके पास ऐसा करने के लिए गोज़ल 6 होना चाहिए, और यदि आप एक ही समय में गौटे का उपयोग कर रहे हैं तो आपको goutte 3.1, अपडेट की आवश्यकता होगी आपकी composer.json

+0

के साथ काम किया है अब बेहतर है? –

+1

यह 'save_to' विकल्प का उपयोग करके, Guzzle 5.3.x के साथ काम करता था। धन्यवाद! –

+4

बस एक नोट - Guzzle 6 में, "save_to अनुरोध विकल्प को सिंक अनुरोध विकल्प के पक्ष में बहिष्कृत कर दिया गया है। Save_to विकल्प प्रदान करना अब सिंक का उपनाम है"। – TeeJay

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