Php 写入webroot目录外的文本文件
我正在尝试使用PHP来读取和写入文本文件。使用html页面上的按钮读取文件。该文件是使用html页面上的按钮编写的,该按钮从文本框中获取参数。当文本文件位于webroot目录中时,我成功地将其写入文本文件。我希望能够读取/写入webroot目录之外的文本文件 我正在Beaglebone上使用lighttpd和PHP。webroot目录位于Php 写入webroot目录外的文本文件,php,file-io,Php,File Io,我正在尝试使用PHP来读取和写入文本文件。使用html页面上的按钮读取文件。该文件是使用html页面上的按钮编写的,该按钮从文本框中获取参数。当文本文件位于webroot目录中时,我成功地将其写入文本文件。我希望能够读取/写入webroot目录之外的文本文件 我正在Beaglebone上使用lighttpd和PHP。webroot目录位于/var/www。我要编辑的文本文件将位于/var/textFiles。我到处寻找解决办法,但似乎都不管用 以下是我发现的最有希望的解决方案,但它似乎不起作用。
/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);
?>
<?php
include_once('index.php');
$model = new readWriteModel();
$model->readFile();
?>
readFunctionCaller.php
<?php
include_once('index.php');
$text = $_POST['input'];
$model = new readWriteModel();
$model->writeFile($text);
?>
<?php
include_once('index.php');
$model = new readWriteModel();
$model->readFile();
?>
在web目录外写入文件与在web目录内写入没有任何区别,一个好的做法是在写入文件时使用绝对路径,这将帮助您解决很多问题,当然,还要确保apache拥有对该文件执行所需操作的正确权限。我能够从根目录之外的文本文件进行读写。为了查看它是否有效,我将webroot目录/var
权限上方的目录设置为777
,将phpRead.txt
设置为777
,并使用/var/textFiles/phpRead.txt
的绝对路径引用该文件。这样做肯定不是最安全的方法,因此,如果您正在读取和写入webroot目录之外的文件,请参阅下面的stackoverflow答案:有关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();
?>
<?php
include_once('index.php');
$text = $_POST['input'];
$model = new readWriteModel();
$model->writeFile($text);
?>
writeFunctionCaller.php:
<?php
include_once('index.php');
$model = new readWriteModel();
$model->readFile();
?>
<?php
include_once('index.php');
$text = $_POST['input'];
$model = new readWriteModel();
$model->writeFile($text);
?>
用户界面的图像:
谢谢大家的帮助 欢迎来到StackOverflow!我很高兴你知道如何正确格式化你的代码;这很有帮助,非常感谢。每行缩进4个空格有点麻烦。如果有一种简单的方法可以粘贴代码,高亮显示代码,并使用快捷方式将所有行缩进4个空格,那就太好了。突出显示代码并按下
{}
按钮。太好了!再次感谢。我尝试过使用$file_handle=fopen(“/var/textFiles/phpRead.txt”,“r”)的绝对路径;但它似乎仍然不起作用。我对文件夹和文本文件都有读、写和执行权限。这似乎仍然不起作用。谢谢你的回复phpalix。我没有使用apache,我使用的是lighttpd。我是PHP新手,所以我刚刚使用chrome的inspect元素来调试我的代码。控制台中似乎没有出现任何东西。是否还有其他地方需要我查看?答案顶部的超链接已断开:(