【问题标题】:Load a file, edit it and the save it (server side) PHP加载文件,编辑并保存(服务器端)PHP
【发布时间】:2014-02-23 12:47:36
【问题描述】:

我有一个页面,可以将文本文件中的 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 id="html_content" style="width:600;height:200;"><?php include("loader.php") ?></textarea>

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

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

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

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

【问题讨论】:

    标签: php html file save textarea


    【解决方案1】:

    更新,如果您只是对如何将 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>
    

    loader.php,现在你有了

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

    这里是“test.html”、“save”和输入到文本区域的任何文本。在您的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
       }
    }
    

    缺点是

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

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


    没必要这么复杂。我会使用更简单和结构化的方法,包括

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

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

    文件.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();
    

    文件.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>
    

    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/"); (??) 等要强大得多。

    【讨论】:

    • 哇,谢谢,但我遇到的主要问题是将 textarea 中的文本传输到 php 脚本。如您所见,我已经完成了加载和删除。您编写代码的方式没有任何问题,但我更愿意继续使用我开始编写它的方式。我看到你使用 POST 来处理内容,不过我会使用 GET,以获得更大的灵活性。
    • 好吧,不太明白 - 为什么不能通过普通表单/提交将 textarea 的内容传递给 PHP 脚本?使用 POST 而不是 GET 的原因是:GET 有一些非常狭窄的限制,在带有 suhosin 补丁的普通 PHP 上,$_GET 字段的默认限制是 512 字节。对于浏览器,GET(包括所有字段)的总最大长度约为 2000 个字符。编辑 HTML 文件时不多 - 请参阅 stackoverflow.com/questions/417142/… - 我认为您最终会使用 POST :)
    • 啊,有一个限制.. 那么,是否可以在表单中有一个 textarea 并通过 POST 提交其内容?我的意思是我想继续使用我已经拥有的脚本,而不是使用 JQuery 或第二个全新的脚本来处理我已经拥有的。
    • 现在,当我意识到你编辑了你的答案时,我自己也做了同样的尝试,这正是我所需要的:)。现在 jQuery POST 函数显然在所有 " 和 ' 字符之前放置了一个 \,这会使我尝试保存的所有 html 无效,并且在每次保存时,斜线重复,最终使行真的很长。我尝试使用 str_replace 替换 \没有任何运气......我真的在这个jQuery“功能”上失去了我的气质。
    • 嘿@PatrickDahlin - 按照我的第一个建议做,客户端encodeURIComponent,服务器端urldecode。这是相当正常的,转义(查找)-永远不要尝试通过 str_replace 或其他任何方式手动“解决”它。 javascript 和 PHP 这两种语言都旨在通过上述函数和其他函数来处理这个问题。
    【解决方案2】:

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

    【讨论】:

    • 问题是把textarea的内容放到脚本里,保存起来没那么难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多