1

我正在摆弄我的代码,试图编写一些代码来获取通过 POST 从表单上传的数据(包括图片),然后创建一个完整的目录及其相关的子目录来存储图像。

在编写代码时,我不断收到错误

Warning: mkdir(): No such file or directory in C:\Users\Admin\Desktop\UniServer\www\AddItem.php on line 94

但是,当我将 mkdir 的 resursion 设置为 true 时,mkdir 突然工作并且目录创建没有任何问题。

我的代码:

if(isset($_FILES['upload']['tmp_name']))
 {
 $numfile=count($_FILES['upload']['tmp_name']);
{
    for($i=0;$i<$numfile;$i++)
    {
        if(is_uploaded_file($_FILES['upload']['tmp_name'][$i]))
        {
            //Conditionals for uploaded file
            $foldername=$_SESSION['UserId'];
            $cat=$_POST['category'];
            $sub=$_POST['subcat'];
            $itemname=$_POST['itemname'];
            $allowed_filetypes=array('.jpg','.gif','.bmp','.png');
            $max_filesize = 2097152; // Maximum filesize in BYTES (currently 2.0MB).
            $upload_path = 'C:\Users\Admin\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\'; // The place the files will be uploaded to.
            //Checks if Folder for User exists
            //If not, A folder for the user is created to store the user's images
            if(!file_exists($upload_path))
            {
                $upload_path=mkdir($upload_path,0644,true);<-- This is the line
            }

            $filename = $_FILES['upload']['name'][$i]; // Get the name of the file (including file extension).
            $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Get the extension from the filename.

            // Check if the filetype is allowed, if not DIE and inform the user.
            if(!in_array($ext,$allowed_filetypes))
            {
                die('The file you attempted to upload is not allowed.');
            }

            // Now check the filesize, if it is too large then DIE and inform the user.
            if(filesize($_FILES['upload']['tmp_name'][$i]) > $max_filesize)
            {
                die('The file you attempted to upload is too large.');
            }

            // Check if we can upload to the specified path, if not DIE and inform the user.
            if(!is_writable($upload_path))
            {
                $errormsg="Image Upload Failed.";
            }

            if(!move_uploaded_file($_FILES['upload']['tmp_name'][$i],"$upload_path" . $filename))
            {
                $errormsg= 'Your file upload was successful, view the file <a href="' . $upload_path . $filename . '" title="Your File">here</a>'; // It worked.
            }

        }
    }
}




 }
   else{echo"Upload failed";}

虽然我的代码现在可以工作,因为我已经将递归设置为 true,但我仍然不明白它为什么工作,所以如果有人能解释为什么我的代码工作正常,我将非常感激。

我最接近的是Why mkdir failed with recursive option set true?

虽然我无法理解链接中所说的任何内容。

谢谢!

4

2 回答 2

1

它失败了,因为它解析作为参数提供的路径并将路径“更改”到新目录的父目录。

试试这个(在一个带有子文件夹test的文件夹中s):

  • mkdir s/s2/s3<- 将失败,因为s2不存在于s
  • mkdir s/s2<-好的
  • mkdir s/s2/s3<-好的

recursive当使用set to调用时TRUE,它会做一些不同的事情:像往常一样分割路径,但检查每个前缀是否存在。

再次在文件夹中test

  • mkdir -p s/s1/s2/s3/s4将产生以下前缀:
    • s
    • s/s1
    • s/s1
    • s/s1/s2
    • s/s1/s2/s3
    • s/s1/s2/s3/s4

注意:我mkdir在linux下使用过,p参数告诉它如果父目录不存在则创建父目录(与递归相同)。

于 2013-07-27T15:33:32.073 回答
1

需要将mkdir()递归设置为 true,因为您要求它创建不存在的嵌套目录,即:

$upload_path = 'C:\Users\Admin\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\';

因此,由于变量 $foldername从用户会话中获取其值,因此如果用户会话更改它会更改。其余部分也是如此$upload_path,如果其中一些发生变化,您必须创建整个路径。只有路径的最后一部分 ( $itemname) 可以在不使用递归选项的情况下进行更改。

于 2013-07-27T15:31:27.477 回答