繁体   English   中英

加载文件,对其进行编辑并保存(服务器端)PHP

[英]Load a file, edit it and the save it (server side) PHP

我得到了一个页面,可将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>

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

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

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

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

更新,确定,如果您不确定如何将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”,“保存”以及键入文本区域的任何文本。 在您的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来执行每个任务,包括一些小的错误处理
  • $.ajax调用(jQuery)的系统,调用上述PHP类

以下工作示例将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,标记

<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);
        }
    });
});

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM