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

Pat*_*lin 1 html php textarea file save

我有一个页面将文本文件中的 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{

        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

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

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

总结一下:我需要帮助将 textarea 的内容获取到脚本以供以后保存。

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

出现的问题是 jQuery 显然将 \ 放在每个 " 或 ' 之前。这弄乱了所有应该干净有效的 html 代码。我必须以某种方式用 " 替换 \",str_replace 不会削减它。有任何想法吗?

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

dav*_*rad 5

更新,好的,如果您只是不确定如何将 textarea 提交到您的 loader.php :

<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>
Run Code Online (Sandbox Code Playgroud)

loader.php,现在你有

<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>
Run Code Online (Sandbox Code Playgroud)

这里是“test.html”、“save”和输入到 textarea 中的任何文本。在上面的if..else循环中使用这些变量,例如

$filename=$_POST['filename']; 
$action=$_POST['action'];
$html_content=$_POST['html_content'];
Run Code Online (Sandbox Code Playgroud)

缺点是

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

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


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

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

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

文件.php

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

file.html,标记

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();
Run Code Online (Sandbox Code Playgroud)

file.html,脚本:

<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>
Run Code Online (Sandbox Code Playgroud)

HTML 内容(标签、HTML 实体)在保存时通过使用encodeURIComponent和 进行维护urldecode。自己尝试一下,并将其视为更复杂系统的基础。如果要创建新文件,只需在文件名框中输入新文件名。如果要加载文件,请在文件名框中输入该文件名。我认为 file_put_contents 等比处理文件句柄chdir(dirname(dirname(__FILE__))."/pages/");(??)等要健壮得多。