我正在摆弄我的代码,尝试编写一些代码,通过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 fails with recursive option set true?
虽然我无法理解链接中所说的内容。
谢谢!
答案 0 :(得分:1)
mkdir()
需要递归设置为true,因为您要求它创建不存在的嵌套目录,即:
$upload_path = 'C:\Users\Admin\Desktop\UniServer\www\images\\'.$foldername.'\\'.$cat.'\\'.$sub.'\\'.$itemname.'\\';
因此,变量$ foldername
从用户会话中获取其值,如果用户会话更改则更改。 $upload_path
部分的其余部分也是如此,如果它们发生了某些变化,则必须创建整个路径。只有路径的最后一部分($itemname
)可以在不使用递归选项的情况下进行更改。
答案 1 :(得分:1)
它失败了,因为它解析了作为参数提供的路径并且&#34;更改&#34;新目录的父路径。
尝试此操作(在文件夹test
中包含子文件夹s
):
mkdir s/s2/s3
&lt; - 将失败,因为s2
s
mkdir s/s2
&lt; - ok mkdir s/s2/s3
&lt; - ok 当recursive
设置为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
注意:我在linux下使用mkdir
并且p
参数告诉它创建父目录(如果它们不存在)(与递归相同)。