Urlencode和file_get_contents

10
我们有一个如下的url:http://site.s3.amazonaws.com/images/some image @name.jpg,它在$string中。
我想要做的事情是(是的,在url周围有空格):
$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
你把URL变成无效的URL,然后想知道为什么它不起作用?这是什么问题?请详细说明。 - hakre
我无法理解这个。你能提供你/我们完整的代码吗? - Funk Forty Niner
这是一个很棒的答案。https://dev59.com/ul3Va4cB1Zd3GeqPB5r4#8260942 - Pratik Bothra
2个回答

12

在整个URL中使用urlencode()函数会生成一个无效的URL。保留URL也不正确,因为与浏览器相反,file_get_contents()函数不执行URL标准化。在你的例子中,你需要用%20替换空格:

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

1
这是一个很好的答案:https://dev59.com/ul3Va4cB1Zd3GeqPB5r4#8260942 - Pratik Bothra
RAWURLENCODE 怎么样? - Jack

0

您指定的URL无效。 file_get_contents需要一个有效的http URI(更准确地说,是底层的http包装器)。由于您的无效URI不是有效的URI,file_get_contents失败。

您可以通过将无效的URI转换为有效的URI来解决此问题。有关如何编写有效URI的信息,请参见RFC3986。您需要确保所有特殊字符都正确表示。例如,空格变成加号,商业符号必须进行URL编码。还需要删除开头和结尾处的多余空格。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接