加载文件,编辑它并保存(服务器端)PHP

时间:2014-02-23 12:47:37

标签: php html file save textarea

我有一个页面,它将文本文件中的html代码加载到textarea中,我需要能够使用脚本保存它的内容。

我正在使用PHP脚本从文件中加载代码并将其回显到textarea,但是如何将内容发送回脚本并将其保存到同一文件或带有文件的文件中新名字?

我在想是否getElementById会帮助我,但我不确定如何。

加载脚本(它也可以删除文件)

// The file hierarchy:
//
//Web root - admin - This file
//         - pages - in here are the page text files

// The variable pagesList is the filename chosen in a dropdown list earlier
$page = $_GET["pagesList"];
$action = $_GET["action"];
//get the path to the page( all pages are in a folder named 'pages')
$filename = dirname(dirname(__FILE__))."/pages/".$page;

if(file_exists($filename) and is_file($filename)){

    //If I want to load a file
    if($action == "open"){
        $f = fopen($filename,"rt");
        $content = fread($f, filesize($filename));
        echo $content;
        @fclose($f);

    //If I want to delete a file
    }elseif($action == "delete" && is_file($filename)){
        //move the working directory to where the file is
        $old = getcwd();
        chdir(dirname(dirname(__FILE__))."/pages/");
        //----
        if(unlink($filename)) 
            echo "File deleted,".$filename;
        else
            echo "Error deleting file!";
        //change back the working directory to where it was
        chdir($old);

    //If I want to save a file
    }elseif($action == "save"){
        if(file_exists($filename)){

            //Unknown script, need help!

        }else{

        }
    }
}    

textarea只有一行,其中包含一个:

   <textarea id="html_content" style="width:600;height:200;"><?php include("loader.php") ?></textarea>

总结一下:我需要帮助将textarea的内容添加到脚本中以便以后保存。

编辑:感谢davidkonrad,我只需在脚本中添加一些POST接收,并添加file_put_content以及发送给它的内容。

出现的问题是jQuery显然在每个“或”之前放置\。这会弄乱所有应该干净且有效的HTML代码。我将不得不用某种方式替换“”,str_replace不会什么想法?

EDIT2:再次感谢davidkonrad通过使用encodeURIComponent(jQuery)clientside和urldecode(PHP)服务器端修复它。

2 个答案:

答案 0 :(得分:4)

更新,如果您对如何向您的loader.php提交textarea有疑问,请确定:

<form method="post" action="loader.php">
<input type="hidden" name="filename" value="test.html">
<input type="hidden" name="action" value="save">
<textarea name="html_content"></textarea>
<input type="submit" value="save">
</form>

loader.php,现在你已经

$filename=$_POST['filename']; 
$action=$_POST['action'];
$html_content=$_POST['html_content'];

这里是“test.html”,“save”以及键入textarea的任何文本。如上所述,在if .. else循环中使用这些变量,例如

} elseif($action == "save"){
   if(file_exists($filename)){
        //Unknown script, need help!
        file_put_contents($filename, $html_content); //or how you want to do it
   }
}

缺点是

  • 需要在每个操作上重新加载页面
  • 一旦插入<textarea> </textarea>之后,您需要再次回显插入的内容(据我所知,HTML是loader.php的一部分)
  • 同样跟踪当前文件名更复杂

注意:除非有特殊原因,否则您无需在写入之前检查文件是否已存在。并且仍然认为在目录中四处走动只会让它变得复杂:) /pages/不只是一个相对路径吗?


它不需要那么复杂。我会使用一种更简单和结构化的方法,包括

  • 一个PHP类,它通过简单的file_put_contentsfile_get_contentsunlink执行每项任务,包括一些小错误处理
  • 调用上述PHP类的$.ajax调用(jQuery)系统

以下工作示例将HTML文件的保存,加载和删除执行到directoty /files,您必须授予RW权限。

file.php

class File {
    private $filename;
    private $dir = 'files/';

    public function __construct() {
        $action = isset($_POST['action']) ? $_POST['action'] : false;
        $this->filename = isset($_POST['filename']) ? $_POST['filename'] : false;
        if ((!$action) || (!$this->filename)) return;
        switch ($action) {
            case 'save' : 
                $this->save(); break;
            case 'load' : 
                $this->load(); break;
            case 'delete' : 
                $this->delete(); break;
            default :
                return;
                break;
        }
    }
    private function save() {
        $content = isset($_POST['content']) ? $_POST['content'] : '';
        file_put_contents($this->dir.$this->filename, urldecode($content));
    }
    private function load() {
        $content = @file_get_contents($this->dir.$this->filename);
        echo $content;
    }
    private function delete() {
        unlink($this->dir.$this->filename);
    }
}
$file = new File();

file.html,markup

<input type="text" id="filename" value="test.txt"><br>
<textarea id="html_content" style="width:600;height:200;"></textarea>
<br>
<button id="save">save</button>
<button id="load">load</button>
<button id="delete">delete</button>

file.html,脚本:

var url = 'file.php';
$("#save").click(function() {
    $.ajax({
        url : url,
        type: 'post',
        data : {
            filename : $("#filename").val(),
            action : 'save',
            content : encodeURIComponent($('#html_content').val())
        }
    });
});
$("#delete").click(function() {
    $.ajax({
        url : url,
        type: 'post',
        data : {
            filename : $("#filename").val(),
            action : 'delete'
        }
    });
});
$("#load").click( function() {
    $.ajax({
        url : url,
        type: 'post',
        data : {
            filename : $("#filename").val(),
            action : 'load'
        },
        success : function(html) {
            $("#html_content").val(html);
        }
    });
});

使用encodeURIComponenturldecode保存HTML内容(标记,HTML实体)。自己尝试一下,并将其视为更复杂系统的基础。如果要创建新文件,只需在文件名框中输入新文件名即可。如果要加载文件,请在文件名框中输入该文件名。我认为file_put_contents等比处理文件句柄chdir(dirname(dirname(__FILE__))."/pages/");(??)等更强大。

答案 1 :(得分:0)

尝试使用php fputs函数保存文件