我正在向PHP进程发布一个变量,试图在目录中找到一个文件。
问题是文件名比用户提交的文件长得多。他们只会提交一个如下所示的航次号码:
222INE
而文件名将如下所示:
CMDU-YMUNICORN-222INE-23082016.txt
所以我需要PHP能够查看目录,找到具有匹配航程号的文件,并确认它是否存在(我真的需要能够下载所述文件,但这将是一个不同的我是否想不出来的问题。)
无论如何,所以这里是采用发布变量的PHP过程:
<?php
if($_POST['voyage'] == true)
{
$voyage = mysqli_real_escape_string($dbc, $_POST['voyage']);
$files = glob("backup/................."); // <-this is where the voyage will go
// it should look like this
// $files = glob("backup/xxxx-xxxxxxxx-222INE-xxxx.txt");
if(count($files) > 0)
{
foreach($files as $file)
{
$info = pathinfo($file);
echo "File found: " . $info["name"];
}
}
else
{
echo "File doesn't exist";
}
}
?>
文件名始终以CMDU开头。第二部分可能有所不同。然后是航次号码。日期,后跟txt。
答案 0 :(得分:1)
您可以使用scandir
功能
它将返回目录中的文件数组
所以,你可以这样做:
$dir = "backup/";
$files = scandir( $dir );
$myFile = null;
foreach( $files as $each ) {
if(preg_match(/*some magic here*/, $each)) {
$myFile = $dir . $each;
}
return $myFile;
我知道这段代码可能有一些错误,但我会尝试这样的事情。
答案 1 :(得分:1)
我将使用scandir函数获取备份目录中的文件列表,并将其过滤到相应的文件中。
$voyageFiles = array_filter( scandir( "backup" ),
function($var) use ($voyage) {
// expand this regexp as needed.
return preg_match("/$voyage/", $var );
}
)
$voyageFile = array_pop( $voyageFiles );
答案 2 :(得分:1)
好的,首先,你必须做一个目录列表
<?php
if($_POST['voyage'] == true)
{
$voyage = $_POST['voyage']; //in this case is not important to escape
$files = scandir("backup"); // <-this is where the voyage will go ***HERE YOU USE DIR LISTING***
unset($files[0], $files[1]) // remove ".." and ".";
if(count($files) > 0)
{
$fileFound = false;
foreach($files as $file)
{
if((preg_match("/$voyage/", $file) === 1)){
echo "File found: $file \n";
$fileFound = true;
}
}
if(!$fileFound) die("File $voyage doesn't exist"); // after loop ends, if no file print "no File"
}
else
{
echo "No files in backup folder"; //if count === 0 means no files in folder
}
}
?>
答案 3 :(得分:0)
你的regix模式:
$voyage = $_POST['voyage'];
$pattern = '/^CMDU-.*-'.$voyage.'-.*\.txt/';
您可以在preg_match函数中使用$pattern
变量