【问题标题】:chmod($file) not working exactly as I want it tochmod($file) 不能完全按照我的意愿工作
【发布时间】:2013-12-02 14:19:48
【问题描述】:

我正在使用chmod($path, $mode, bool) 函数,但它没有正确设置权限,所以我现在正在尝试:

$fp = fopen($path, 'w');
fclose($fp);
chmod($path, 0750);  //changed to add the zero
return true;

问题是当我使用第一种方法时,它创建的路径正常...类似这样的东西 uploads/2013/name/1/file.pdf(correct) 但permissio0ns 不正确。

当我使用第二种方法时,它会创建一个没有扩展名的文件:uploads/2013/name/1(incorrect) 但权限是正确的...

这是我的代码:

if($_POST["upload"]){

$year = date('Y');

//path to directory
$path = $_SERVER["DOCUMENT_ROOT"] . '/uploads/' . $year . '/' . strtolower(str_replace(' ','',$_POST["username"])) . '/' . $_POST["month"];

//path to file
$target_path = $path . '/' . basename($_FILES['uploadedfile']['name']);

$filename = basename($_FILES['uploadedfile']['name']);

/* $ext = substr($filename, strrpos($filename, '.') + 1); */

if(!is_dir($path) && !file_exists($target_path)) {

    mkdir($path, 0750, true);

    chmod($path, 0750, true);  //changed to add the zero

    if(($_FILES["uploadedfile"]["type"] == "application/pdf") && ($_FILES["uploadedfile"]["size"] < 550000)) {

        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)){

            print "<div class='success'>The file " . "<span class='filename'>" . basename( $_FILES['uploadedfile']['name']) . "</span>" . " has been uploaded</div>";
        }
    } else {

        print "<div class='error'>Wrong file format</div>";

    }

} else {

    print "<div class='error'>File already exists!</div>";

}

}

【问题讨论】:

  • 提示:如果您想创建一个空文件,请使用 touch($path) 而不是 fopen()/fclose()
  • 为什么$target_path 几乎重复了所有$path 逻辑?为什么不只是$target_path = $path . '/' . basename(...)?请注意,$_FILES 中的['type'] 参数NOT 可靠。它是用户提供的,伪造起来很简单。
  • 我不想创建一个空文件,所以我需要摆脱 fopen / fclose。我想为正在上传的文件添加权限,@Michael 代码需要大量清理我只是想让它首先工作。

标签: php upload fopen chmod


【解决方案1】:

看起来您遇到了umask 的问题,请尝试:

umask(0)

在脚本的开头。

默认 umask 是从您的系统配置中获取的,通常为 0022,每次您在 php 中执行 chmod 时都会应用此设置,因此 umask 为 0022 的 chmod 0777 会变成 0755

【讨论】:

  • 添加 unmask(0) 已将文件权限设置为我想要的 750,但路径仍然不正确..
【解决方案2】:

看起来您的脚本是在网络服务器上下文中执行的。所以可能是webserver-user没有权限更改文件权限或者设置了系统umask。

由于 php 的 chmod 只是系统 chmod 的包装器,您可以轻松地以执行用户的身份尝试此命令。

例如在我的系统上(www-data 是 apache 用户)

$ cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.10
DISTRIB_CODENAME=quantal
DISTRIB_DESCRIPTION="Ubuntu 12.10"
NAME="Ubuntu"
VERSION="12.10, Quantal Quetzal"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu quantal (12.10)"
VERSION_ID="12.10"
$ sudo su - www-data -s /bin/bash
$ chmod 750 myfile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多