【问题标题】:How to save a *.txt file with PHP on a specific path?如何使用 PHP 在特定路径上保存 *.txt 文件?
【发布时间】:2012-03-17 09:09:54
【问题描述】:

我正在尝试编写一个简单的 PHP 脚本,将字符串写入 .txt 文件。 简单的。为此,我有这个:

<?php
if(isset(isset($_GET["fileName"]) == true && isset($_GET["output"]) == true){
    $fp = fopen($_GET["fileName"], "a+");
    if($fp !== null){
        fputs($fp, $_GET["output"] . "\r\n");
        fclose($fp);
    }
}
?>

但我确实需要能够保存到特定位置,所以我写了这个:

<?php
if(isset($_GET["filePath"]) == true && isset($_GET["fileName"]) == true && isset($_GET["output"]) == true){
    $fp = fopen($_GET["filePath"] . $_GET["fileName"], "a+");
    if($fp !== null){
        fputs($fp, $_GET["output"] . "\r\n");
        fclose($fp);
    }
}
?>

当然,这行不通。
1. 如何使用 PHP 保存到特定位置?
2.这个路径可以是相对路径吗? (我只是发送“/output/”,保存会按预期完成)。

谢谢。

现在我在这里:

<?php
if(isset($_GET["filePath"]) && isset($_GET["fileName"]) && isset($_GET["output"])){

    $filename=preg_replace('/[^a-z0-9]/i', '', $_GET['fileName']).'.txt';
    $filepathSanitized='http://thepathtomywebsite/~subdomain/'.$_GET["filePath"].$filename;

    echo $filepathSanitized;  // i get the correct path, but no file is present there 
    $fp = fopen($_GET["filepathSanitized"], "a+");
    if($fp !== null){

        fputs($fp, $_GET["output"] . "\r\n");
        fclose($fp);
    }
    else echo ('Something wrong'); // it never gets to this
}
?>

我这样称呼上面的:

$.get("save_me.php", { filePath: "demo/", fileName: "text", output: 'thing to write into' });

但是没有创建文件。我不知道要调试什么才能找出问题所在。 谢谢。

【问题讨论】:

  • 您嵌套的isset() 毫无意义,而且闻起来像是会导致致命错误的东西。除此之外,你真的不需要== true 每次。这是隐含的,添加它只会使您的代码膨胀。
  • 嵌套的 isset().. 这难道不能帮助我检查是否发送了某些东西吗?我认为这是正确的做法。谢谢。

标签: php fopen filepath


【解决方案1】:

您可能会发现这是一个权限问题 - 调试您的代码以查看是否实际设置了 $fp。

此外,这样的代码可能非常危险,它允许在允许网络服务器访问的任何地方创建或替换文件。您应该清理文件名,并自己创建完整路径,例如

//clean any nasties from the filename
$filename=preg_replace('/[^a-z0-9]/i', '', $_GET['fileName']).'.txt';

//calculate a path relative to our document root...
$filepath=$_SERVER['DOCUMENT_ROOT'].'/path/to/files/'.$filename;

【讨论】:

  • 首先——谢谢你,你提出了一些非常重要的(虽然这对我来说应该很明显)问题。我会更新状态。
【解决方案2】:

但是没有创建文件。我不知道要调试什么才能找出问题所在。谢谢。

您应该调试传递给 fopen() 的参数。

【讨论】:

  • 感谢您的明确回答和您的时间。我学到了一些不错的东西,但另一个答案是针对我当前遇到的问题更轻松一些。
  • 我知道我不应该允许用户访问包含“../”的路径,因为这可能意味着他们可以浏览整个文件树并可能替换重要文件。此外,允许脚本仅访问包含输出文件的文件夹非常重要。我没有使用 base_path 方法,因为我正在学校的服务器上工作,并且有一个类似“students.school.com/~user/XML”的域,并且 base_path 回显返回“/servername/studs/user/html/XML”-> 这是我认为来自服务器的文件路径。
  • 另外,我不需要创建子目录,因为我只需要一个文件夹输出,但很高兴知道该怎么做。再次感谢您!
  • 好的,这似乎是一个解决方案,但我有 2 个问题: 1. $target = realpath(BASE_PATH . $_GET['fileName']);什么都不返回。我已经用我的工作字符串更新了 base_path。 2.去掉realpath(),回显$target,看起来不错,但是没有创建文件。我对此真的很陌生,对于所有这些麻烦,我深表歉意。
  • 是的,和上面的完全一样。 file_put_contents()。并添加了 error_reporting(E_ALL);但没有错误可见。对不起..
猜你喜欢
  • 1970-01-01
  • 2014-05-19
  • 2015-09-07
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多