2012-08-07 16 views
5

स्टोर करें मैं एक दूरस्थ फ़ाइल डाउनलोड करना चाहता हूं और इसे मूल सर्वर के समान नाम से अपनी सर्वर निर्देशिका में डाल देना चाहता हूं। मैंने file_get_contents($url) का उपयोग करने की कोशिश की।फ़ाइल_get_contents() पर दूरस्थ फ़ाइल नाम नहीं मिल सकता है और फिर फ़ाइल

समस्या यह है कि फ़ाइल नाम $url में शामिल नहीं है, यह है: www.domain.com?download=1726। यह यूआरएल मुझे देता है, उदाहरण: myfile.exe, इसलिए मैं file_put_contents('mydir/myfile.exe'); का उपयोग करना चाहता हूं।

मैं फ़ाइल नाम कैसे प्राप्त कर सकता हूं? मैंने डाउनलोड करने से पहले get_headers() की कोशिश की, लेकिन मेरे पास केवल फ़ाइल का आकार, संशोधन दिनांक और अन्य जानकारी है, फ़ाइल नाम गुम है।

+0

एक नज़र cURL पर यह कवर करना चाहिए क्या आप http जरूरत है: // php.net/manual/en/book.curl.php – Waygood

+0

कर्ल फ़ाइल नाम के लिए इस प्रश्न को देखें http://stackoverflow.com/questions/1750055/with-php-curl-get-filename-from-file-header – Waygood

उत्तर

0

file_get_contents() HTTP wrapper पर सीधे फ़ाइल डाउनलोड नहीं करता है अगर फ़ाइल वेबसर्वर द्वारा पूर्व-विश्लेषण किया गया है।

निम्न उदाहरण लें: यदि आप एक निकालें वेबपेज (example.com/foobar.php) पर file_get_contents() कहते हैं, आप स्रोत कोड foobar.php की के साथ प्रस्तुत नहीं किया जाएगा, लेकिन कैसे example.com की वेबसर्वर PHP फ़ाइल पार्स करता है। तो आप केवल जेनरेट किए गए HTML आउटपुट को पुनर्प्राप्त करने में सक्षम होंगे।

यदि फ़ाइल नाम यूआरएल में मौजूद नहीं है और कोई रास्ता नहीं है कि आप इसे कहीं से भी ला सकते हैं, तो आप एक मृत अंत में हैं। डेटा डेटाम के पारदर्शी क्षेत्र से को बुलाया नहीं जा सकता है।

वैकल्पिक समाधान के लिए, मैं केवल cURL पुस्तकालय उपयोग करने का सुझाव (यह अपने सर्वर से प्रश्नों को संभालने के लिए, प्रयोग किया जाता है (क्योंकि यह एक ग्राहक) URL का उपयोग कर के साथ थे अन्य सर्वर को इसलिए नाम दक्ष यूआरएल) कर सकते हैं या file sockets । यहां another question's answer on Stack Overflow है जो वर्णन करता है कि cURL का उपयोग करके फ़ाइल नाम कैसे प्राप्त करें।

इसके अलावा, आप domain.com के व्यवस्थापक/रखरखाव/वेबमास्टर टीम के संपर्क में रहने का प्रयास कर सकते हैं, यह पूछने के लिए कि क्या उनके पास फ़ाइल नाम और अन्य मेटाडेटा लाने के लिए सार्वजनिक रूप से उपलब्ध API है या नहीं।

+0

धन्यवाद आप तेजी से जवाब के लिए। मैं curl कोशिश करेंगे। लेकिन मुझे अभी भी आश्चर्य है, ब्राउज़र वास्तव में फ़ाइल नाम कैसे जानता है? जब मैं ब्राउज़र में यह यूआरएल डालता हूं, तो मुझे वास्तविक फ़ाइल नाम के साथ त्वरित विंडो मिलती है। इसलिए, जब मैं पहले उपयोग करता हूं: ini_set ('user_agent', 'मोज़िला/5.0 (एक्स 11; यू; लिनक्स i686; एन-यूएस; आरवी: 1.9.0.16) गेको/200 9 161601 उबंटू/9.04 (जौंटी) फ़ायरफ़ॉक्स/3.0।16 '); मैंने सोचा कि मैं एक ब्राउज़र की तरह हूं :) – Peter222

+0

[आरएफसी 2183] (http://www.ietf.org/rfc/rfc2183.txt) 'सामग्री-विस्थापन:' शीर्षलेख का वर्णन करता है और यह शामिल करने में सक्षम है एक 'फ़ाइल नाम' निर्देश। ब्राउज़र शीर्षलेख के इस भाग को पार्स करते हैं और वे इससे विभिन्न मेटाडेटा प्राप्त करते हैं। मेरे उत्तर में संबंधित उत्तर से जुड़े उत्तर की जांच करें, यह एक विधि का वर्णन करता है कि PHP (और curl) का उपयोग करके इस हेडर को कैसे प्राप्त किया जा सकता है। – Whisperity

+0

मैंने ऊपर दिए गए सभी उदाहरणों का परीक्षण किया। कोई सफलता नहीं। मैंने इस उदाहरण वर्ग को पूरा करने की कोशिश की: http://stackoverflow.com/questions/6177661/how-do-download-a-file-with-curl लेकिन curl द्वारा मूल फ़ाइल नाम नहीं मिल सकता है। भले ही फ़ाइल नाम यूआरएल में शामिल है। क्या कोई भी सार्वजनिक फाइल (जेपीजी या कुछ) के आधार पर काम कर सकता है। बस रिमोट डाउनलोड करें और उसी नाम से स्थानीय रूप से सहेजें। मैं बहुत आभारी रहूंगा। गुगलिंग 2 दिन, कोई विचार नहीं :( – Peter222

7

मैंने इसे एक और तरीका हल किया। मैंने पाया कि यदि यूआरएल हेडर में सामग्री-स्वभाव नहीं है, तो फ़ाइल नाम URL में मौजूद है। इसलिए, यह कोड किसी भी प्रकार के यूआरएल के साथ काम करता है (कोई कर्ल आवश्यक नहीं):

$url = "http://www.example.com/download.php?id=123"; 
// $url = "http://www.example.com/myfile.exe?par1=xxx"; 
$content = get_headers($url,1); 
$content = array_change_key_case($content, CASE_LOWER); 

    // by header 
if ($content['content-disposition']) { 
    $tmp_name = explode('=', $content['content-disposition']); 
    if ($tmp_name[1]) $realfilename = trim($tmp_name[1],'";\''); 
} else 

// by URL Basename 
{ 
    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    $realfilename = basename($stripped_url); 

} 

यह काम करता है! :)

+0

+1। यह बहुत उपयोगी है, लेकिन आप इसे उत्तर के रूप में क्यों स्वीकार नहीं करते? क्या इस कोड में कोई समस्या है? – aliqandil

5

पीटर 222 के कोड के आधार पर मैंने फ़ाइल नाम प्राप्त करने के लिए एक समारोह लिखा था।

function get_real_filename($headers,$url) 
{ 
    foreach($headers as $header) 
    { 
     if (strpos(strtolower($header),'content-disposition') !== false) 
     { 
      $tmp_name = explode('=', $header); 
      if ($tmp_name[1]) return trim($tmp_name[1],'";\''); 
     } 
    } 

    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    return basename($stripped_url); 
} 

उपयोग:: आप $ http_response_header चर का उपयोग कर सकते हैं ($ http_response_header file_get_contents द्वारा भरा जाएगा())

$url = 'http://example.com/test.zip'; 
$myfile = file_get_contents($url); 
$filename = get_real_filename($http_response_header,$url)