【问题标题】:PHP or Apache Delete FilesPHP 或 Apache 删除文件
【发布时间】:2012-03-26 09:11:31
【问题描述】:

我有一个星号服务器,它将通话记录放在 /var/spool/asterisk/monitor 目录中。我设法让 Apache (httpd) 显示此目录中所有内容的列表。

我有一个辅助过程,它正在下载这些录音并对其进行处理。完成该过程后,我希望它能够删除它提取的记录。

如果我必须使用 PHP,我可以,但我已经尝试过,但对它的工作知之甚少。我正在尝试下面的代码,我猜它是权限问题或其他什么,但我不知道如何更改 apache 用户以作为更高级别的用户运行(root 可以,是的,我知道后果)。

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php

        if($_GET['action'] == 'delete')
        {
                $myfile = $_GET['filename'];
                $path = getcwd();
                echo($path . "/" . $myfile);
                if(unlink($path . "/" . $myfile))
                {
                        echo('Success!!!');
                }
                else
                {
                        echo('Failure');
                }
        }
        else
        {
                echo('doing nothing');
        }

?>
</body>
</html>

另一个我可以接受的选项是能够对文件执行 HTTP DELETE 动词并让 Apache 处理它,但我也找不到关于如何设置它的好文章。

这是我在 httpd.conf 文件中的条目

Alias /recordings "/var/spool/asterisk/monitor"
<Directory "/var/spool/asterisk/monitor">
        Options Indexes FollowSymLinks MultiViews ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
</Directory>

请帮忙。

【问题讨论】:

    标签: php apache http centos delete-file


    【解决方案1】:

    在检索文件的GET 请求旁边,您可以执行DELETE 删除文件的请求。

    默认情况下,Apache 没有 DELETE 方法的请求处理程序,但您可以创建自己的 delete.php 来处理 DELETE 请求:

    <?php
    /**
     * delete script
     */
    if ($_SERVER['REQUEST_METHOD'] !== 'DELETE') {
        header('Method not allowed', 405);
        exit;
    }
    $basepath = __DIR__;
    $file = basename($_SERVER['REQUEST_URI']);
    $path = $basepath . '/' . $file;
    $exists = file_exists($path);
    if (!$exists) {
        header($_SERVER['SERVER_PROTOCOL'] . ' 204 No Content'); // HTTP/1.1 ...
        exit;
    }
    $success = unlink($path);
    if ($success) {
        printf("Deleted %s\n", $file);
    } else {
        header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');
    }
    

    然后,在您的 .htaccess 文件中,您将所有 DELETE 请求映射到您的删除脚本:

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} =DELETE [NC]
    RewriteRule .* delete.php
    

    这样一个脚本的好处是,它通过定义的 HTTP 状态代码正确地传达成功或失败:Hypertext Transfer Protocol -- HTTP/1.1 (RFC2616) Section 9.7 DELETE

    【讨论】:

      【解决方案2】:

      你为什么放 "\\" ?路径不会有那个双斜线吧!

      取消链接非常直接

      为了确认路径是否正确.. 尝试使用 fopen 打开文件。如果它有效。取消链接删除它

      http://php.net/manual/en/function.unlink.php

      检查文件是否存在并删除它

      http://php.net/manual/en/function.file-exists.php

      检查文件权限和您的删除权限

      http://us.php.net/fileperms

      【讨论】:

      • 我将其更改为“/”,但在 unlink() 命令上它仍然给我一个错误。 php 文件与我要使用的所有 wav 文件位于同一目录中
      • 然后 / 也不需要,只需将文件名作为要删除的文件和 php 在同一文件夹中
      • 您是否尝试过 fopen 并尝试添加或打印一些内容
      • 一旦我执行 $file = fopen($myfile) 我如何打印内容...我现在感觉很迟钝,哈哈
      • 查看答案——你可以试试file-exist
      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2020-10-14
      相关资源
      最近更新 更多