PHP/HTML上传脚本工作不正常


PHP / HTML uploading script not working right

我是PHP的新手(也没有太多HTML经验),我有一个问题。我有一个文件上传系统,它由两个PHP脚本组成(见下文)。在文件上传表单中,用户选择文件,保存文件夹,然后上传。保存位置可以从下拉菜单中选择,下拉菜单由上传目录中的文件夹组成。但下拉菜单中还有另一个选项。如果用户选择选项other,则会出现一个新字段(由JavaScript完成),用户可以手动插入位置(例如,目录不存在,用户想要创建一个新目录)。

但这里有一个问题:如果用户选择了一个预定义的文件夹,一切都可以,但如果用户将目录名写入字段,则只会创建名为folder的文件夹。例如,如果用户想上传一张关于花的照片,但不存在名为flower的文件夹,则用户选择other并将flower写入框中。然后点击上传按钮,基本上PHP应该创建一个名为flower的新文件夹,并将图片上传到那里。但目前,PHP制作了一个名为folder的文件夹,由于某种原因,图片没有上传到那里(它没有上传到任何地方)。

我的脚本问题:

  1. 不会创建新文件夹。我想这是因为我有两个名为"folder"的值,但我不知道如何让它工作,如果选择了"other",那么PHP只会看到最后一个值
  2. 即使创建了文件夹,由于某种原因也不会上传文件

如果有人能找到解决我问题的方法并帮助我解决问题,我将不胜感激。请不要犹豫,询问更多信息,因为我的英语不是最好的,因此有些事情无法理解。

提前感谢!

第一个文件:file-upload.php:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<script language="JavaScript" type="text/javascript">
<!--
function Toggle(obj){
var val=obj.value;
if (!obj.m){ obj.m=''; }
if (!obj.m.match(val)){ obj.m+=','+val+','; }
var hide=obj.m.split(',');
for (var zxc0=0;zxc0<hide.length;zxc0++){
if (document.getElementById(hide[zxc0])){
document.getElementById(hide[zxc0]).style.display='none';
}
}
var show=val.split(',');
for (var zxc1=0;zxc1<show.length;zxc1++){
if (document.getElementById(show[zxc1])){
document.getElementById(show[zxc1]).style.display='';
}
}
}
//-->
</script>
</head>
<body>
<h1>Upload</h1>
<form action="upload.php" method="post"
enctype="multipart/form-data"><br>
<label for="file">File:</label>
<input type="file" name="file" id="file" /> 
    <br>
    Tüüp: <select name="folder" value="folder" onchange="Toggle(this);">
<?php  
foreach(glob('/uploadfolder/*',      GLOB_ONLYDIR) as $dir) 
{ 
    $dir = basename($dir); 
    echo '<option value="', $dir, '">', $dir, '</option>'; 
}  
?>
<option value="folder">other</option>
        </select><br> 
<input id="folder" value="Create a new folder" style="display:none;">
<input type="submit" name="submit" value="Upload" />
</form>
</body>
</html>

第二个文件:upload.php:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
</head>
<body>
<h1>Upload</h1>
<br>
<?php
$dirname  = $folder = $_POST["folder"];
$filename = "/uploadfolder/" . "$dirname" . "/";
if (!file_exists($filename)) {
    mkdir("/uploadfolder/" . "$dirname", 0777);
}
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-     officedocument.spreadsheetml.sheet"))
&& ($_FILES["file"]["size"] < 5120000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Name: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Tmp. file: " . $_FILES["file"]["tmp_name"] . "<br />";
    echo "Folder: " . $folder . "<br />";
    if (file_exists("/uploadfolder/$folder/" . $_FILES["file"]["name"]))
      {
       echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "/uploadfolder/$folder/" . $_FILES["file"]["name"]);
      echo "Saved: " . "" . $_FILES["file"]["name"];
      }
     }
  }
else
  {
  echo "Upload failed";
  }
 ?>
</body>
</html>

执行以下步骤

在file-upload.php中,为新文件夹名称的文本字段添加一个name属性。就这样吧,

<input id="folder" value="Create a new folder" name="newfolder" style="display:none;">

现在在upload.php文件中进行如下更改,

$dirname = $_POST["folder"];
$filename = ("./uploadfolder/" . "$dirname" . "/");
if($dirname=="folder"){$dirname=$_POST["newfolder"];}
if (!file_exists($filename)) {
    mkdir("./uploadfolder/" . "$dirname", 0777);
}

通过out使用$dirname作为文件夹名称。所以用$dirname 代替$folder

另一件事是,如果上传仍然不能正常工作,只需使用"./uploadfolder/$folder/"作为基本路径。同时授予777访问您工作区的权限。您可以使用以下命令,

chmod -R 777 <path_to_uploadfolder>

正如其他SOF用户所提到的,从一开始的文件存在检查中删除exit;

希望你有答案!:)

目前PHP制作了一个名为"文件夹"的文件夹,由于某种原因,图片甚至没有上传到

这是因为在第二个文件的以下摘录中有一个exit;

<?php
$dirname = $_POST["folder"];
$filename = ("/uploadfolder/" . "$dirname" . "/");
if (!file_exists($filename)) {
    mkdir("/uploadfolder/" . "$dirname", 0777);
    exit;
} else {
}
?>

因此,一旦创建文件夹,脚本就会退出。

您的脚本存在多个安全问题,但我不想讨论这些问题,因为这里不是安全课程的地方:)

mkdir后面的行exit将导致脚本停止执行。如果要创建文件夹,然后继续上传文件,则需要删除exit语句。您也可以删除其中的else部分,因为它是空的。。。

$dirname  = $folder = $_POST["folder"];
$filename = "/uploadfolder/" . "$dirname" . "/";
if (!file_exists($filename)) {
    mkdir("/uploadfolder/" . "$dirname", 0777);
}
if ((($_FILES["file"]["type"] == "image/gif")
...