php - file_get_contents - 下载文件名中带空格的文件不起作用

时间:2011-11-24 17:11:29

标签: php urlencode file-get-contents

我正在尝试使用file_get_contents()功能下载文件。 但是,如果文件的位置为http://www.example.com/some name.jpg,则该功能无法下载。

但如果网址是http://www.example.com/some%20name.jpg,则会下载相同的内容。

我尝试了rawurlencode()但这会隐藏网址中的所有字符,下载再次失败。

有人可以为此建议解决方案吗?

5 个答案:

答案 0 :(得分:24)

我认为这对你有用:

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 :(得分:1)

您可能已经发现urlencode()只应用于需要转义的URL的每个部分。

docs for urlencode()开始,只需将其应用于图片文件名,即可解决问题并保留其余网址。从您的示例中,您可以安全地编码最后一个“/”字符后的所有内容

答案 2 :(得分:0)

这可能是一个更好的解决方案。如果出于任何原因,您使用的是相对网址:

// www.example.com/path

在php 5.4.7之前,这不会创建会抛弃maček函数的[scheme]数组元素。这种方法也可能更快。

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

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

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

答案 3 :(得分:0)

假设只有文件名有问题,这是一种更好的方法。只有urlencode最后一节即。文件名。

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

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

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

答案 4 :(得分:-1)

这应该有效

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