簡體   English   中英

PHP mkdir():權限被拒絕

[英]PHP mkdir():Permission denied

我有一個簡單的 PHP/HTML/CSS 應用程序,可以為新注冊的用戶創建一個文件夾。 它在我的測試站點上運行良好,但並不是說我已准備好“上線”,我收到了“mkdir(): Permission denied”錯誤。 據我所知,兩個站點上的所有設置都相同,根文件夾和上傳文件夾的文件權限設置為 755。其他一切都按預期工作,接受下面的代碼...

if (count($errors) == 0) {
        $pword = md5($pword_1);//encrypt the pword before saving in the database
        $rand = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz";
        $rand = str_shuffle($rand);
        $folder = substr($rand, 0, 10);
        $regDate = date("Y-m-d");
        $token = 0;
        $tokenExp = 0;
        $curDir = getcwd();

        if(mkdir($curDir . "/uploads/" . $folder, 0755)){
            $query = "INSERT INTO users (uname, email, pword, folder, regDate, token, tokenExp) VALUES ('$uname', '$email', '$pword', '$folder', '$regDate', '$token', '$tokenExp')";
            mysqli_query($db, $query);
            $_SESSION['uname'] = $uname;
            $_SESSION['success'] = "You are now logged in";
            header('location: index.php');
        }else{
            array_push($errors, "An error occurred creating your account!!!");
        }
    }

據我所知無法創建用戶的文件夾,我無法上傳文件。 但是,在進行故障排除時,當我手動將文件夾添加到服務器時,我仍然收到“找不到路徑”錯誤。 這是上傳文件的代碼...

if(isset($_POST['uploads'])){
    $uname = mysqli_real_escape_string($db, $_POST['uname']);
    $name = $_FILES['file']['name'];
    $size = $_FILES['file']['size'];
    $type = $_FILES['file']['type'];
    $tmp_name = $_FILES['file']['tmp_name'];
    $extension = substr($name, strpos($name, '.') + 1);
    $max_size = 2500000; //bytes

    if(empty($name)) {
        echo "<p class='error'>Please Select a File</p>";
    }else{
        if($extension == "jpg" || $extension == "jpeg" || $extension == "gif" || $extension == "tif" || $extension == "png" || $extension == "pdf"){
            if($extension == $size<=$max_size){
                $getFold = "SELECT * FROM users WHERE uname='$uname'";
                $getFold = mysqli_query($db, $getFold);
                while($for = mysqli_fetch_assoc($getFold)){
                    $folder = $for['folder'];
                }
                $location = "uploads/" . $folder . "/";
                if(move_uploaded_file($tmp_name, $location . $name)){
                    $query = "INSERT INTO `upload` (name, size, type, location, uname, folder) VALUES ('$name', '$size', '$type', '$location', '$uname', '$folder')";
                    $result = mysqli_query($db, $query);
                    if($result){
                        echo "<p class='success'>File has been uploaded successfully!!!</p>";
                    }else{
                        echo "<p class='error'>Failed to upload file information to database!!! Filename already exist!</p>";
                    }               
                }else{
                    echo "<p class='error'>Failed to Upload File</p>";
                }
            }else{
                echo "<p class='error'>File size should be 3MB or less</p>";
            }
        }else{
            echo "<p class='error'>The selected file is not a JPG, JPEG, GIF, TIF, PNG, or PDF file type!!!</p>";
        }
    }
}

您需要將嘗試為用戶創建子文件夾的文件夾的所有者更改為:

  1. apache - 在 CentOS 服務器的情況下
  2. www-data - 如果是 Ubuntu 服務器

您可以使用以下命令來完成

sudo chown -R www-data /folder

-R標志意味着它是遞歸的,因此運行 php 的 apache/httpd 進程也將擁有您可能創建的所有子文件夾。

有關此命令的更多信息,請查看此SO 帖子

您創建具有權限0755的目錄,這意味着所有者具有完全訪問權限,其他人只能讀取 + 執行。 將其更改為07770766 對任何人的完全訪問權限或對所有者的完全訪問權限以及對任何人的讀寫權限。
這也適用於父文件夾。

感謝您的幫助,我聽從了您的建議,結果我的主機提供商阻止了通過 cPanel 訪問的模糊“設置”位置中的功能。 以前(即在我較舊的測試服務器/帳戶上),帳戶會自動設置為允許讀/寫訪問,較新的帳戶設置為只讀,並要求帳戶所有者通過設置進行切換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM