2011-11-24 108 views
7

我試圖使用file_get_contents()函數下載文件。 但是,如果文件的位置是http://www.example.com/some name.jpg,則該功能無法下載此文件。php - file_get_contents - 下載文件時文件名空格不起作用

但是,如果網址是http://www.example.com/some%20name.jpg,則下載相同。

我試過rawurlencode()但是這會隱藏URL中的所有字符,下載失敗了。

有人可以請建議一個解決方案嗎?

+2

難道你不是指['file_get_contents'](http://php.net/file_get_contents)? –

+0

'some + name.jpg'應該可以工作。它如何下載失敗? 404錯誤? 400個不好的要求? file_put_contents()用於保存數據。如果你提供了一個URL,你就會有效地嘗試進行http上傳,這很可能不是你想要的。 –

+0

他遇到的問題是'rawurlencode'將會對字符串進行雙重編碼,如果它已經被編碼的話。然而,在對它們進行編碼之前簡單解碼所有字符串看起來並不會起作用。他需要一個適用於所有URL的函數 –

回答

1

正如你可能已經想出urlencode()應該只用於需要轉義的URL的每個部分。

docs for urlencode()只需將它應用於圖像文件名稱就可以解決問題,並將其餘的URL保留下來。從你的例子,你可以放心地編碼一切繼上次 「/」 字符

-1

這應該工作

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

如問題所述,如果'$ file ='some%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 

備註:

我可能會使用urldecodeurlencode作爲輸出將是相同的每個網址。 rawurlencode將保留+,即使%20可能適用於您正在使用的任何網址。

+1

明智的答案 - 一直在尋找這一切....真的很酷 –

0

這可能是一個更好的解決方案。如果由於某種原因,你使用的是相對URL,如:

//www.example.com/path

到PHP 5.4.7這不會創造條件,甩開maček的[方案]數組元素之前功能。這種方法也可能更快。

$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); 
}