8

我们有一个类似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到浏览器地址栏中,图像将打开。

有什么不好以及如何解决?

4

2 回答 2

11

对整个 URL使用函数urlencode(),将生成一个无效的 URL。保持 URL 不变也是不正确的,因为与浏览器相比,该file_get_contents()函数不执行URL 规范化。在您的示例中,您需要将空格替换为%20

$string = str_replace(' ', '%20', $string);
于 2012-06-17T12:56:03.573 回答
1

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

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

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

于 2012-06-17T12:55:45.407 回答