我正在尝试使用file_get_contents()
功能下载文件。
但是,如果文件的位置为http://www.example.com/some name.jpg
,则该功能无法下载。
但如果网址是http://www.example.com/some%20name.jpg
,则会下载相同的内容。
我尝试了rawurlencode()
但这会隐藏网址中的所有字符,下载再次失败。
有人可以为此建议解决方案吗?
答案 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
注意:
我可能会使用urldecode
和urlencode
,因为每个网址的输出都是相同的。即使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);