在网站根目录之外的文本文件中写入内容

3
我正在尝试使用PHP从文本文件中读取和写入数据。通过HTML页面上的按钮来读取文件,通过带有文本框参数的HTML页面上的按钮进行写入。当文本文件位于Web根目录下时,我可以成功地写入文本文件。但是,我想要读/写一个位于Web根目录之外的文本文件。
我在Beaglebone上使用lighttpd和PHP,Web根目录位于/var/www。我要编辑的文本文件将位于/var/textFiles。我已经到处寻找解决方案,但似乎没有一个能够正常工作。
以下是我发现的最有前途的解决方案,但它似乎无法正常工作。当我单击“读取”或“写入”按钮时,页面似乎陷入了无限循环。我想知道是否有人知道为什么会出现这种情况,或者他们能否提供更好的解决方案。
以下是我的代码:
index.php
<?php 
echo '<script language="javascript" type="text/javascript" src="jquery-1.9.0.min.js"></script>';
echo "<form name='write' action='writeFunctionCaller.php' method='post'>Input text to 
write to text file: <input type='text' name='input'>
<input type='submit' value='Write' ></form>
<form name = 'read' action='readFunctionCaller.php' method='get'>
<input type='submit' value='Read'></form><br><div id='fileContent'></div>";

class readWriteModel {

   function readFile() {
        $file_handle = fopen("secure.php?file=phpRead.txt", "r");
        while (!feof($file_handle)) {
            $line = fgets($file_handle);
            echo $line;
            echo '<br>';
        }
        fclose($file_handle); 
    }

    function writeFile($text) {
        echo ("Write Success! ");
        $filename = "secure.php?file=phpRead.txt";
        file_put_contents($filename, $text, FILE_APPEND | LOCK_EX);
    }
}
?>

secure.php

<?php
//validate that the user should have access to the file here

//Make sure it exists
$folder = realpath('/var/textFiles');
if(!$file = realpath($folder.'/'.$_GET['file']))
    error(404);
if(!is_file($file))
    error(404);

//Check for cheaters
if(substr($file,0,strlen($folder)) !== $folder)
    error(401);

header(sprintf("Content-type: %s;",getMimeType($file)));
readfile($file);
exit;

function error ( $code = 401, $msg = null ) {
    $msgs = array(
      400 => 'Bad Request',
      401 => 'Unauthorized',
      402 => 'Payment Required',
      403 => 'Forbidden',
      404 => 'Not Found',
    );
    if(!$msg) $msg = $msgs[$code];
    header(sprintf('HTTP/1.0 %s %s',$code,$msg));
    printf('<html><head><title>%s %s</title></head><body><h1>%s</h1></body> 
    </html>',$code,$msg,$msg);
    exit;
}

function getMimeType ( $filename ) {
    //MIME MAP
    $mime_extension_map = array(
    'txt'           => 'text/plain',
    );
    //Get Extension
    $ext = strtolower(substr($filename,strrpos($filename,'.') + 1));
    if(empty($ext))
      return 'application/octet-stream';
    elseif(isset($mime_extension_map[$ext]))
      return $mime_extension_map[$ext];
    return 'x-extension/' . $ext;
}
?>

writeFunctionCaller.php

<?php 
include_once('index.php');
$text = $_POST['input'];
$model = new readWriteModel();
$model->writeFile($text);
?>

readFunctionCaller.php

<?php 
include_once('index.php');
$model = new readWriteModel();
$model->readFile();
?>

1
欢迎来到StackOverflow!我很高兴你找出了如何正确格式化你的代码;这会帮助很多人。 - Levi Morrison
非常感谢。每行缩进4个空格有点麻烦。如果有一种简单的方法可以粘贴代码,将其突出显示,并使用快捷键将所有行缩进4个空格,那就太好了。 - Matthew Leonard
你可以。选中代码,然后按下“{}”按钮。 - Levi Morrison
2个回答

2
我能够读写根目录外的文本文件。为了验证其是否有效,我将目录设置为Webroot目录上面的/var权限为777,并将phpRead.txt权限设置为777,并使用绝对路径/var/textFiles/phpRead.txt引用该文件。这绝对不是最安全的方法,因此如果您要读写Webroot目录之外的文件,请参见以下stackoverflow答案:https://stackoverflow.com/a/3012330/2047335 以获取有关PHP安全性的更多信息。

以下是我用于读写Webroot目录上方的文本文件的文件:

index.php:

<?php 
echo '<script language="javascript" type="text/javascript" src="jquery-1.9.0.min.js"></script>';

echo "<form name='write' action='writeFunctionCaller.php' method='post'>";
echo    "Input text to write to text file: <input type='text' name='input'><input type='submit' value='Write' >";
echo "</form>";

echo "<form name = 'read' action='readFunctionCaller.php' method='get'>";
echo    "<input type='submit' value='Read'>";
echo "</form>";
echo "<br>";
echo "<div id='fileContent'></div>";

class readWriteModel{
  function readFile() {
  $file_handle = fopen("/var/textFiles/phpRead.txt", "r");
  while (!feof($file_handle)) {
   $line = fgets($file_handle);
   echo $line;
   echo '<br>';
   }
  fclose($file_handle); 
  }
  function writeFile($text) {
   echo ("Write Success! ");
   $filename = "/var/textFiles/phpRead.txt";
   file_put_contents($filename, $text, FILE_APPEND | LOCK_EX);
   }
}

?>

readFunctionCaller.php:

<?php 
include_once('index.php');
$model = new readWriteModel();
$model->readFile();
?>

writeFunctionCaller.php:

<?php
include_once('index.php');
$text = $_POST['input'];
$model = new readWriteModel();
$model->writeFile($text);
?>

用户界面图片:

用于在Web根目录之外读写文本文件的PHP用户界面

感谢大家的帮助!


2
答案上面的超链接已经损坏 :( - Andrey Pokhilko

0

将文件写入网站目录之外与在网站目录内部写入文件没有任何区别,一个好的实践是在写入文件时使用绝对路径,这将帮助您避免许多麻烦,并且当然要确保 Apache 有正确的权限执行所需的操作。


我尝试使用绝对路径 $file_handle = fopen("/var/textFiles/phpRead.txt", "r");,但似乎仍然无法工作。我已经在两个文件夹和文本文件上设置了读取、写入和执行权限,但仍然无法正常工作。感谢您的回复,phpalix。 - Matthew Leonard
我没有使用Apache,而是使用lighttpd。我对PHP很新,所以我一直在使用Chrome的检查元素来调试我的代码。控制台似乎没有弹出任何东西。我应该去看另一个地方吗? - Matthew Leonard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接