file_exists()在循环中不在php5里面工作

时间:2017-06-08 00:30:09

标签: php if-statement while-loop get

file_exists不起作用。我看了几个例子但仍然没有。程序未检测到该文件。我的文件路径是/var/www/osbs/PHPAPI/recording.mp3,网站根目录是osbs。此文件的位置在PHPAPI中,这就是我没有在file_put_contents中放置完整路径的原因。该程序能够制作原始recording.mp3,但不能制作任何附加版本。

<?php
$actual_name = pathinfo("PHPAPI/recording.mp3",PATHINFO_FILENAME);
$original_name = $actual_name;
$extension = pathinfo("PHPAPI/recording.mp3",PATHINFO_EXTENSION);

if ($_GET["RecordingUrl"]) {
     if (file_exists("/var/www/osbs/PHPAPI/".$actual_name.".".$extension)) {
        $actual_name = find_new_name($original_name, $extension);
     }
     else {
        $actual_name = $original_name;
     }
     $name = $actual_name.".".$extension;
     file_put_contents($name, file_get_contents($_GET["RecordingUrl"]));
}

function find_new_name ( $file, $extension ) {
    $name = $file.".".$extension;
    $i = 0;
    while(file_exists("/var/www/osbs/PHPAPI/".$name)){
        $new_name = $file.$i;
        $name = $new_name.".".$extension;
        $i++;
    }
    return $new_name;
}
 ?>

8 个答案:

答案 0 :(得分:2)

你确定路径吗? /PHPAPI会在/PHPAPI内查找文件,而不是预期的/var/www/osbs/PHPAPI/。您应该检查PHPAPI/$filename

答案 1 :(得分:2)

问题似乎出现在脚本的第一行:

$actual_name = pathinfo("PHPAPI/recording.mp3", PATHINFO_FILENAME);

这会将recording.mp3分配给$actual_filename。然后,您通过将扩展名连接到文件名来检查{​​{1}}。我想你想使用recording.mp3.mp3,它将返回文件名sans扩展名。

答案 2 :(得分:2)

您的问题在于file_put_contents。您需要指定完整路径,并且只需指定文件名。在使用之前尝试echo $name,您会发现它不是路径,只是文件名。

我建议你在文件的开头用路径设置一个常量,而不是有时依赖于相对路径,有时依赖于绝对路径。

<?php
const SAVE_PATH = "/var/www/osbs/";

$actual_name = pathinfo(SAVE_PATH."PHPAPI/recording.mp3",PATHINFO_FILENAME);
$original_name = $actual_name;
$extension = pathinfo(SAVE_PATH."PHPAPI/recording.mp3",PATHINFO_EXTENSION);

if (isset($_GET["RecordingUrl"]) && $_GET["RecordingUrl"]) {
     if (file_exists(SAVE_PATH."PHPAPI/".$actual_name.".".$extension)) {
        $actual_name = find_new_name($original_name, $extension);
     }
     else {
        $actual_name = $original_name;
     }
     $name = $actual_name.".".$extension;

     file_put_contents(SAVE_PATH.'PHPAPI/'.$name, file_get_contents($_GET["RecordingUrl"]));
}

function find_new_name ( $file, $extension ) {
    $name = $file.".".$extension;
    $i = 0;
    while(file_exists(SAVE_PATH."PHPAPI/".$name)){
        $new_name = $file.$i;
        $name = $new_name.".".$extension;
        $i++;
    }
    return $new_name;
}
 ?>

我改变了什么:

  1. 定义了const SAVE_PATH = "/var/www/osbs/";
  2. 到处使用新常量。有时候没有更多的亲戚,有时也绝对,这绝对是绝对的。
  3. 使用file_put_contents中的常量(这是实际修正,你需要一个完整的路径
  4. 添加了额外的检查以确保RecordingUrl未设置,否则在未设置时会收到PHP警告。

答案 3 :(得分:2)

您必须将所有逻辑放在find_new_name()函数中。这会让你的代码更清晰

if ($_GET["RecordingUrl"]) {
  $name = find_new_name("PHPAPI/recording.mp3");
  file_put_contents($name, file_get_contents($_GET["RecordingUrl"]));
}

function find_new_name($name) {
  $info = pathinfo($name);
  $name = $info['basename'];
  $i = 0;
  while (file_exists("$info[dirname]/$name")) {
    $name = sprintf('%s%d.%s', $info['filename'], ++$i, $info['extension']);
  }
  return "$info[dirname]/$name";
}

答案 4 :(得分:1)

您对文件的网址及其路径

感到困惑

您的httdoc(或public_html)根目录是 / var / www / osbs / PHPAPI

但您的文件系统根目录是“ /

<强>尝试

file_put_contents( __DIR__.'/'.$name, file_get_contents($_GET["RecordingUrl"]));

您的代码中存在许多不良做法

答案 5 :(得分:1)

您忘记了file_put_contents()的路径。 它应该是:

file_put_contents("PHPAPI/".$name, file_get_contents($_GET["RecordingUrl"]));

或者:

file_put_contents("/var/www/osbs/PHPAPI/".$name, file_get_contents($_GET["RecordingUrl"]));

答案 6 :(得分:0)

'file_exists'和其他一些文件调用如fstat由php缓存。这在file_exists的手册中有记录。文件不存在时的第一次调用将保存并在后续调用中返回。在调用之间使用'clearstatcache()'来清除缓存。

答案 7 :(得分:0)

“小”重构:

  1. 到处都是绝对的路径
  2. 透明功能,更加不言自明的名称,更简单的使用参数
  3. 防止恶意输入($ _POST真的不会削减它)
  4. 为什么要在实际复制()

    时使用file_put_contents()
    <?php
    
    define("SRC_PATH", "/var/www/osbs/whereverYourSrcIs/");
    define("SAVE_PATH", "/var/www/osbs/PHPAPI/");
    
    function findAvailableName($name) {
        $i = 1;
        $pathinfo = pathinfo($name);
        while(file_exists($name)) {
            $name = $pathinfo['dirname'] . '/' . $pathinfo['filename'] . "." . $i++ . "." . $pathinfo['extension'];
        }
        return $name;
    }
    
    if (isset($_GET["RecordingUrl"]) && $_GET["RecordingUrl"]) {
    
        if (strpos('/' . $_GET['RecordingUrl'] . '/', '/../') !== false) {
            die("invalid input, don't be evil");
        }
    
        copy(SRC_PATH . $_GET["RecordingUrl"], findAvailableName(SAVE_PATH . "recording.mp3"));
    }