Urlencode和file_get_contents

时间:2012-06-17 12:24:00

标签: php file urlencode file-get-contents

我们在http://site.s3.amazonaws.com/images/some image @name.jpg

中有$string这样的网址

我正在尝试做什么(是的,网址周围有空格):

$string = urlencode(trim($string));
$string_data = file_get_contents($string);

我得到了什么(@也被替换了):

file_get_contents(http%3A%2F%2Fsite.s3.amazonaws.com%2Fimages%2Fsome+image+@name.jpg)[function.file-get-contents]: failed to open stream: No such file or directory

如果您将http://site.s3.amazonaws.com/images/some image @name.jpg复制/粘贴到浏览器地址栏中,图片将会打开。

有什么不好以及如何解决这个问题?

2 个答案:

答案 0 :(得分:9)

对整个网址使用函数urlencode(),将生成无效的网址。保留URL也不正确,因为与浏览器相比,file_get_contents()功能不执行URL normalization。在您的示例中,您需要将空格替换为%20

$string = str_replace(' ', '%20', $string);

答案 1 :(得分:1)

您指定的网址无效。 file_get_contents期望有效的http URI(更确切地说,底层的http包装器会这样做)。由于您的无效URI不是有效的URI,file_get_contents会失败。

您可以通过将无效的URI转换为有效的URI来解决此问题。 RFC3986中提供了有关如何编写有效URI的信息。您需要注意正确表示所有特殊字符。例如空格到加号,标志处的广告必须是URL编码的。还需要删除开始和结束时多余的空格。

完成后,网络服务器会告诉您禁止访问。然后,您可能需要通过HTTP上下文选项为HTTP文件包装器添加其他请求标头以解决此问题。您可以在PHP手册中找到相关信息:http:// -- https:// — Accessing HTTP(s) URLs