【问题标题】:PHP file_get_contents() not working when + (plus) sign is in file name当+(加号)符号在文件名中时PHP file_get_contents()不起作用
【发布时间】:2015-08-17 05:25:01
【问题描述】:

我有几个文件名中有加号,我似乎无法打开它们,因为函数将其解释为空格。

示例:

File name: Report_Tue-Jun-02-2015-14:11:04-GMT+0200-(W.-Europe-Daylight-Time).html

当我尝试打开它时:

Warning: file_get_contents(/cores/Report_Tue-Jun-02-2015-14:11:04-GMT 0200-(W.-Europe-Daylight-Time).html) [function.file-get-contents]: failed to open stream: No such file or directory in .... on line 150

这是我的代码:

$file = $_GET['FILE'];  
$file = str_replace('+', '%2B', $file);
$content = file_get_contents($file);

有什么想法/解决方案吗?

【问题讨论】:

  • 这就是为什么我们需要在使用之前对文件名/url/路径进行编码。
  • 你的意思是 url_encode 吗?我试过了,但没有用。
  • 如果你在加号之前用反斜杠转义它是否有效?
  • 什么操作系统和 PHP 版本?

标签: php file-get-contents symbols


【解决方案1】:

首先文件不应包含:符号。
然后下面的代码对我来说很好。

$content = file_get_contents('Report_Tue-Jun-02-2015-141104-GMT+0200-(W.-Europe-Daylight-Time).html');

echo $content;

如果不行,请使用:

$link = urlencode($url);
$content = file_get_contents($link);
echo $content;

我每次都认为它的工作。

【讨论】:

  • 你不觉得 rawurlencode 更安全吗? .只是问
  • 这取决于你所追求的。它们之间的主要区别当然是它们编码的标准,还有空格。 urlencode 的编码方式与表单数据的编码方式相同 urlencode 将空格编码为 + 符号,而 rawurlencode 将它们编码为 %20。
【解决方案2】:

RFC3986 中提供了如何编写有效 URI 的信息。首先,您需要注意正确表示所有特殊字符。例如加号的空格,广告的 at 标志必须是 URL 编码的。

还需要删除开头和结尾的多余空格。对整个 URL 使用函数 urlencode(),将生成一个无效的 URL。保持 URL 不变也是不正确的,因为与浏览器相比,file_get_contents() 函数不执行 URL 规范化。在您的示例中,您需要将加号替换为 %2B:`

 $string = str_replace('+', '%2B', $string);

这就是例如。 encodeURIComponent() 在 JavaScript 中执行。不幸的是,这不是urlencode 在 PHP 中所做的(rawurlencode 更安全)。还要检查link

我希望这对你有用。

【讨论】:

  • 你的意思是$string = str_replace('+', '%2B', $string);吗?
  • 但是 %20 不就相当于空格吗?
  • 同意你@Raptor
  • 试试@file_get_contents($string);请一次
  • @DeepKakkar 如果我使用@file_get_contents($file);它不显示任何内容
【解决方案3】:

以下方法对我很有效。

<?

    # File name: Report_Tue-Jun-02-2015-14:11:04-GMT+0200-(W.-Europe-Daylight-Time).html 

    # Method 1.

    $file = 'Report_Tue-Jun-02-2015-14:11:04-GMT+0200-(W.-Europe-Daylight-Time).html';

    $data = file_get_contents($file);

    print($data);

    # Method 2.

    $data = file_get_contents('Report_Tue-Jun-02-2015-14:11:04-GMT+0200-(W.-Europe-Daylight-Time).html');

    print($data);
?>

【讨论】:

  • 我要做的是(在考虑到下面的评论之后): $file = str_replace('+', '%2B', $file); $content = file_get_contents($file);然而,它不起作用。
  • 使用 $file = 'Report_Tue-Jun-02-2015-14:11:04-GMT+0200-(W.-Europe-Daylight-Time).html'; $data = file_get_contents($file); 对我来说效果很好你能展示更多你的代码吗?
  • $file = $_GET['FILE']; 之后添加print $file; 并发布您看到的内容。这可能已被编码,与您的预期不符。
猜你喜欢
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多