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;
}
?>
答案 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;
}
?>
我改变了什么:
const SAVE_PATH = "/var/www/osbs/";
file_put_contents
中的常量(这是实际修正,你需要一个完整的路径)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)
“小”重构:
为什么要在实际复制()
时使用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"));
}