2011-11-24 195 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); 
}