我们在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
复制/粘贴到浏览器地址栏中,图片将会打开。
有什么不好以及如何解决这个问题?
答案 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