2011-11-24 14 views
7

मैं file_get_contents() फ़ंक्शन का उपयोग कर फ़ाइलों को डाउनलोड करने का प्रयास कर रहा हूं। हालांकि अगर फ़ाइल का स्थान http://www.example.com/some name.jpg है, तो फ़ंक्शन इसे डाउनलोड करने में विफल रहता है।php - file_get_contents - फ़ाइल नाम में रिक्त स्थान वाली फ़ाइलों को डाउनलोड करना

लेकिन यदि यूआरएल http://www.example.com/some%20name.jpg के रूप में दिया गया है, तो यह डाउनलोड हो जाता है।

मैंने rawurlencode() की कोशिश की लेकिन यह यूआरएल में सभी पात्रों को कवर करता है और डाउनलोड फिर से विफल हो जाता है।

क्या कोई इस के लिए समाधान सुझा सकता है?

+2

क्या आपका मतलब ['file_get_contents'] (http://php.net/file_get_contents) नहीं है? –

+0

'कुछ + name.jpg' काम करना चाहिए। यह डाउनलोड करने में कैसे विफल रहता है? 404 त्रुटि? 400 गलत अनुरोध? file_put_contents() बचत डेटा के लिए है। यदि आप एक यूआरएल प्रदान करते हैं, तो आप प्रभावी रूप से एक http अपलोड करने की कोशिश कर रहे हैं, जो संभवत: आप जो चाहते हैं वह नहीं है। –

+0

वह समस्या जो उसके पास है वह है 'rawurlencode' एक स्ट्रिंग को एन्कोड करेगा यदि यह पहले ही एन्कोड किया गया है। हालांकि, एन्कोडिंग से पहले सभी तारों को बस डीकोड करना ऐसा नहीं लगता है कि यह या तो काम करेगा। उन्हें एक ऐसे फ़ंक्शन की आवश्यकता है जो सभी यूआरएल –

उत्तर

1

जैसा कि आपने शायद पहले से ही यूरेनकोड() का पता लगाया है, केवल यूआरएल के प्रत्येक भाग पर उपयोग किया जाना चाहिए जिसके लिए भागने की आवश्यकता है।

docs for urlencode() से बस इसे छवि फ़ाइल नाम पर लागू करें जिससे आपको समस्या मिलती है और शेष यूआरएल अकेला छोड़ दिया जाता है। अपने उदाहरण से आप सुरक्षित रूप से पिछले "/" वर्ण

-1

यह

$file = 'some file name'; 
urlencode($file); 
file_get_contents($file); 
+0

के लिए काम करेगी जैसा कि सवाल में बताया गया है, अगर '$ file = 'कुछ% 20file% 20name'', तो यह असफल हो जाएगा। उसे कुछ चाहिए जो दोनों के लिए काम करता है। –

+0

फिर संभवतः 'escapeshellcmd()' काम करेगा – Kirill

22

काम करना चाहिए मुझे लगता है कि यह आपके लिए काम करेंगे निम्नलिखित सब कुछ सांकेतिक शब्दों में बदलना कर सकते हैं:

function file_url($url){ 
    $parts = parse_url($url); 
    $path_parts = array_map('rawurldecode', explode('/', $parts['path'])); 

    return 
    $parts['scheme'] . '://' . 
    $parts['host'] . 
    implode('/', array_map('rawurlencode', $path_parts)) 
    ; 
} 


echo file_url("http://example.com/foo/bar bof/some file.jpg") . "\n"; 
echo file_url("http://example.com/foo/bar+bof/some+file.jpg") . "\n"; 
echo file_url("http://example.com/foo/bar%20bof/some%20file.jpg") . "\n"; 

आउटपुट

http://example.com/foo/bar%20bof/some%20file.jpg 
http://example.com/foo/bar%2Bbof/some%2Bfile.jpg 
http://example.com/foo/bar%20bof/some%20file.jpg 

नोट:

मैं शायद urldecode और urlencode का उपयोग करता हूं क्योंकि आउटपुट प्रत्येक यूआरएल के लिए समान होगा। rawurlencode+ को संरक्षित रखेगा, भले ही %20 शायद आप जो भी यूआरएल उपयोग कर रहे हों उसके लिए उपयुक्त हो।

+1

शानदार उत्तर - इसके लिए पूरे दिन खोज रहा था .... वास्तव में अच्छा –

0

यहां शायद एक बेहतर समाधान है। आप की तरह एक रिश्तेदार यूआरएल का उपयोग कर रहे किसी भी कारण से हैं:

//www.example.com/path

PHP के लिए 5.4.7 इस [scheme] सरणी तत्व जो बंद Macek फेंक नहीं बना होगा पहले समारोह। यह विधि भी तेज हो सकती है।

$url = '//www.example.com/path';

preg_match('/(https?:\/\/|\/\/)([^\/]+)(.*)/ism', $url, $result); 

$url = $result[1].$result[2].urlencode(urldecode($result[3])); 
0

केवल फ़ाइल नाम मान लिया जाये कि समस्या नहीं है, यह एक बेहतर तरीका है। केवल अंतिम खंड यानी urlencode। फ़ाइल का नाम।

private function update_url($url) 
{ 
    $parts = explode('/', $url); 

    $new_file = urlencode(end($parts)); 
    $parts[key($parts)] = $new_file; 

    return implode("/", $parts); 
}