【问题标题】:File rename failing on web serverWeb 服务器上的文件重命名失败
【发布时间】:2012-08-06 16:07:03
【问题描述】:

我有以下在本地运行良好的脚本:

    <?php

//Report all errors
error_reporting(E_ALL);

if ($handle = opendir('instance/system/application/images/dir/testimages/')){

    while (false !== ($fileName = readdir($handle))){
        $newName = str_replace(" ", "_", $fileName);
        rename($fileName, $newName);
    }

    echo "All files have been renamed";
    closedir($handle);
}
?>

但是,当在网络服务器上运行时,我收到以下错误:

警告:rename(.,.) [function.rename]: Permission denied in C:\inetpub\vhosts\domain.com\httpdocs\rename.php on line 10

知道如何解决这个问题吗?

干杯

注意:

我正在使用 IIS7 和 Windows 服务器。

【问题讨论】:

  • 哪个用户拥有instance/system/application/images/dir/testimages/,访问权限是什么,http服务器在哪个用户下运行?
  • 确保文件夹目录也被授予权限。

标签: php permissions


【解决方案1】:

几件事:

在 Windows 中,转到要重命名文件的目录,右键单击,然后查看文件夹和其中文件的权限。无论进程正在运行,Web 服务器都需要具有修改这些文件或在目录中创建新文件的权限。

其次,更微妙的是 - 我认为根本原因是一个错误。在PHP manual 中,有一条评论建议重命名会将文件放在当前工作目录中,除非您在“to”参数中指定完整的目录路径。 因此,如果您尝试将“c:\instance/system/application/images/dir/testimages/banana pic.jpg”重命名为banana_pic.jpg,您当前的代码会将其写入当前工作目录——可能是php.exe - 这将失败。

我会尝试指定要放置重命名文件的文件夹,看看是否可行...

【讨论】:

  • 所以我需要这样做:rename($fileName, 'instance/system/application/images/dir/testimages/'.$newName);
  • rename('instance/system/application/images/dir/testimages/'.$fileName, 'instance/system/application/images/dir/testimages/'.$newName);可能会这样做......
【解决方案2】:

为要重命名为 777 的文件设置权限。
在文件管理器(如 filezilla)中,右键单击文件并设置权限。
或者只是谷歌:设置服务器上文件的权限。
你也可以通过 PHP 尝试:http://php.net/manual/en/function.chmod.php

【讨论】:

    【解决方案3】:

    要重命名或 chmod 文件,您需要有权执行此操作。这意味着该文件应该由网络服务器进程拥有,或者应该具有允许任何人更改它的适当模块(如 777)

    【讨论】:

    • 这个是 linux 特有的,还是可以应用到 windows web server 上的?
    • chmod 777 是特定于 linux 的。在windows中有不同的方法。试试这个: cacls myfile.txt /p everyone:f
    【解决方案4】:

    注意:此注释不适用于 Windows 服务器。当我发表评论时,我没有意识到这一点。这适用于linux,而不是windows。

    您没有编辑图像的权限,因此需要 chmod() 文件:

    chmod() 函数更改了文件的权限,因此您可以重命名它。 “777”意味着任何人都可以(在一毫秒内)更改、读取和执行文件。然后你把它写回“644”,这样任何人都可以读取,但只有你可以更改文件。第二步是为了安全。您不希望每个人都可以编辑和执行服务器上的文件。

    <?php
    
    //Report all errors
    error_reporting(E_ALL);
    
    if ($handle = opendir('instance/system/application/images/dir/testimages/')){
    
        while (false !== ($fileName = readdir($handle))){
            $newName = str_replace(" ", "_", $fileName);
            chmod($fileName, 777);
            rename($fileName, $newName);
            chmod($newName, 644);
        }
    
        echo "All files have been renamed";
        closedir($handle);
    }
    ?>
    

    【讨论】:

    • 假设您有 chmod 文件的许可。
    • 这确实是一个假设,尽管在大多数标准虚拟主机包中都是如此。
    • Warning: chmod() [function.chmod]: Permission denied in C:\inetpub\vhosts\domain.com\httpdocs\rename.php on line 12 我有这个错误...我我正在使用 Windows 框
    • 我没有看到它是一个 windows 盒子。这条评论不适合。抱歉,我会在评论中说明这一点。
    猜你喜欢
    • 2016-12-08
    • 2016-05-22
    • 1970-01-01
    • 2022-01-19
    • 2010-12-08
    • 2019-07-30
    • 1970-01-01
    • 2011-03-23
    • 2015-11-24
    相关资源
    最近更新 更多