PHP脚本不创建XML文件

hsgswve4  于 2022-12-25  发布在  PHP
关注(0)|答案(2)|浏览(107)

我在使用PHP脚本时遇到了一些问题。我正在尝试做两件事:
1.在/usr/local/ezreplay/data/XML/目录中创建一个XML文件,并使用从HTML表单传递给它的输入向其中添加内容;
1.上载包含在提交的HTML表单中的PCAP文件。
下面是我的PHP(抱歉,它有点长,但我相信它的所有相关的这里):

<?php

// Check if the 'expirydate' input is set
if (isset($_POST['expirydate'])) {

  // Convert the input string to a timestamp using 'strtotime'
  $timestamp = strtotime($_POST['expirydate']);

  // Format the timestamp as a 'mm/dd/yyyy' string using 'date'
  $expirydate = date('m/d/Y', $timestamp);
}

// Check if all required POST variables are set
if ( isset($_POST['destinationip']) && isset($_POST['destinationport']) && isset($expirydate) && isset($_POST['multiplier']) && isset($_POST['pcap']) ) {

    // Set the path for the XML file
    $path = '/usr/local/ezreplay/data/XML/' . trim($_POST['destinationip']) . ':' . trim($_POST['destinationport']) . ':' . $expirydate . ':' . trim($_POST['multiplier']) . ':' . trim($_POST['pcap']) . '.xml';

    // Initialize the contents of the XML file
    $contents = "";

    // Open the XML file in append mode
    if ( $fh = fopen($path,"a+") ) {

        // Add the opening 'config' tag to the XML file
        $contents .= '<config>';

        // If the 'destinationip' and 'destinationport' POST variables are not empty, add a 'destination' tag to the XML file
        if ( trim( $_POST['destinationip'] ) != "" && trim( $_POST['destinationport'] ) != "" ) {
            $contents .= "\n" . '<destination>' . $_POST['destinationip'] . ':' . $_POST['destinationport'] . '</destination>';
        }

        // If the 'multiplier' POST variable is not empty, add a 'multiplier' tag to the XML file
        if ( trim( $_POST['multiplier'] ) != "" ) {
            $contents .= "\n" . '<multiplier>' . $_POST['multiplier'] . '</multiplier>';
        }

        // If the 'pcap' POST variable is not empty, add a 'pcap' tag to the XML file
        if ( trim( $_POST['pcap'] ) != "" ) {
            $contents .= "\n" . '<pcap>/usr/local/ezreplay/data/PCAP/' . $_POST['pcap'] . '</pcap>';

            // Add default tags to XML config file to ensure the pcap does not fail and loops continuously until expiration date hits
            $contents .= "\n" . '<loop>0</loop>';
            $contents .= "\n" . '<nofail>true</nofail>';
        }

        // Add the closing 'config' tag to the XML file
        $contents .= "\n" . '</config>';

        // Write the contents to the file
        if ( fwrite( $fh, $contents ) ) {
            // Success
        } else {
            echo "The XML config could not be created";
        }

        // Close the file
        fclose($fh);
    }
}

// Set the target directory and file name
$target_dir = "/usr/local/ezreplay/data/PCAP/";
$basename = basename($_FILES["pcap"]["name"]);
$target_file = $target_dir . $basename;

// Check if the file has a pcap extension
$allowedExtensions = array('pcap');
$basenameWithoutExt = null;
foreach ($allowedExtensions as $allowedExtension) {
    if (preg_match('#\\.' . $allowedExtension . '$#',$basename)) {
        $basenameWithoutExt = substr($basename,0,-1 - strlen($allowedExtension));
        break;
    }
}

// Accept only .pcap files
if (is_null($basenameWithoutExt)) {
    echo "Sorry, only .pcap files are allowed. Please try creating your Packet Replay again using a .pcap file.";
    exit;
}

// Check if the file already exists
if (file_exists($target_file)) {
    echo "The Packet Replay could not be started, the PCAP is already running.";
    exit;
}

// Try to upload the file
if (move_uploaded_file($_FILES["pcap"]["tmp_name"], $target_file)) {
    // Success
} else {
    echo "Sorry, there was an error uploading your file.";
    exit;
}

// Start the Packet Replay
$command = '/usr/local/ezreplay/bin/startreplay.sh ' . $path;
system($command);

echo "The Packet Replay has been started.";

?>

现在文件上传工作正常了,我可以看到浏览器中返回的最终回显消息,但XML文件从未创建。我已经将目录所有权更改为apache用户,甚至chmod 777以消除任何权限问题,但它仍然无法创建文件。
你知道为什么这个不工作吗?PHP和apache错误日志没有显示任何问题,正如我提到的,脚本似乎在一定程度上工作,因为文件上传进行得很完美。
谢谢!

uyhoqukh

uyhoqukh1#

我认为由于文件名中的“/”,文件没有被创建。

j9per5c4

j9per5c42#

我设法用以下编辑修复了这个问题。

<?php

// Set the target directory and file name
$target_dir = "/usr/local/ezreplay/data/PCAP/";
$basename = basename($_FILES["pcap"]["name"]);
$target_file = $target_dir . $basename;

// Check if the file has a pcap extension
$allowedExtensions = array('pcap');
$basenameWithoutExt = null;
foreach ($allowedExtensions as $allowedExtension) {
    if (preg_match('#\\.' . $allowedExtension . '$#',$basename)) {
        $basenameWithoutExt = substr($basename,0,-1 - strlen($allowedExtension));
        break;
    }
}

// Accept only .pcap files
if (is_null($basenameWithoutExt)) {
    echo "Sorry, only .pcap files are allowed. Please try creating your Packet Replay again using a .pcap file.";
    exit;
}

// Check if the file already exists
if (file_exists($target_file)) {
    echo "The Packet Replay could not be started, the PCAP is already running.";
    exit;
}

// Try to upload the file
if (move_uploaded_file($_FILES["pcap"]["tmp_name"], $target_file)) {
    //Success
} else {
    echo "Sorry, there was an error uploading your file.";
    exit;
}

// Check if the 'expirydate' input is set
if (isset($_POST['expirydate'])) {
  // Convert the input string to a timestamp using 'strtotime'
  $timestamp = strtotime($_POST['expirydate']);
  // Format the timestamp as a 'mm-dd-yyyy' string using 'date'
  $expirydate = date('m-d-Y', $timestamp);
}

// Check if 'destinationip', 'destinationport', 'multiplier' and 'pcap' required POST variables are set
if (isset($_POST['destinationip']) && isset($_POST['destinationport']) && isset($_POST['multiplier'])) {

  // Set the filename and path for the XML file
  $file = '/usr/local/ezreplay/data/XML/' . trim($_POST['destinationip']) . ':' . trim($_POST['destinationport']) . ':' . trim($_POST['multiplier'])  . ':' . $expirydate . ':' . $_FILES["pcap"]["name"] . '.xml';

  // Initialize the contents of the XML file
  $contents = "";

  // Add the opening 'config' tag to the XML file
  $contents .= '<config>';

  // If the 'destinationip' and 'destinationport' POST variables are not empty, add a 'destination' tag to the XML file
  if (trim($_POST['destinationip']) != "" && trim($_POST['destinationport']) != "") {
    $contents .= "\n" . '<destination>' . $_POST['destinationip'] . ':' . $_POST['destinationport'] . '</destination>';
  }

  // If the 'multiplier' POST variable is not empty, add a 'multiplier' tag to the XML file
  if (trim($_POST['multiplier']) != "") {
    $contents .= "\n" . '<multiplier>' . $_POST['multiplier'] . '</multiplier>';
  }

  // If the 'pcap' POST variable is not empty, add a 'pcap' tag to the XML file
  if (trim($_FILES["pcap"]["name"]) != "") {
    $contents .= "\n" . '<pcap>/usr/local/ezreplay/data/PCAP/' . $_FILES["pcap"]["name"] . '</pcap>';
  }

  // Add default tags to XML config file to ensure the pcap does not fail and loops continuously until expiration date hits
  $contents .= "\n" . '<loop>0</loop>';
  $contents .= "\n" . '<nofail>true</nofail>';

  // Add the closing 'config' tag to the XML file
  $contents .= "\n" . '</config>';

  // Write the contents to the file
  if (file_put_contents($file, $contents)) {
    // Success
  } else {
    echo "The XML config could not be created";
  }
}

// Start the Packet Replay
$command = '/usr/local/ezreplay/bin/startreplay.sh ' . $path;
system($command);

echo "The Packet Replay has been started.";

?>

相关问题