PHP - 将多张照片上传到新创建的目录中

时间:2014-08-28 18:16:34

标签: php html mysql file-upload directory

我几天来一直在寻找如何将多张照片上传到数据库而不会使系统超载的答案,并决定最好的方法是将多张照片上传到新创建的目录(通过php创建)和商店而是数据库中的目录链接。我正在做的是一个基本上创建一个新的独特页面的表单。这个独特的页面有一组独特的照片,因此我需要在每次生成页面时生成一个文件夹,并将路径链接上传到数据库!我该怎么办?

这是我的HTML:

<form method="post" action="test.php" enctype="multipart/form-data">
  <p>File:</p>
  <input type="file" name="file[]" id="file" >
  <input type="submit" value="Upload">
</form>

这是我的PHP到目前为止(应该在正确的轨道上我希望:/):

<?php
  //Connect to DB
  $conn = mysql_connect ('localhost', 'root', 'root');
  if (!$conn){
    die("Could Not Connect to MySQL!");
  }
  if(!mysql_select_db("test")){
    die("Could Not Open Database:" . mysql_error());
  }
  echo "<p>Connected</p>";

  //Upload Files
  foreach ($_FILES['file']['name'] as $f => $name) {
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $name);
    $extension = end($temp);

    if ((($_FILES["file"]["type"][$f] == "image/gif")
    || ($_FILES["file"]["type"][$f] == "image/jpeg")
    || ($_FILES["file"]["type"][$f] == "image/jpg")
    || ($_FILES["file"]["type"][$f] == "image/png"))
    && ($_FILES["file"]["size"][$f] < 2000000)
    && in_array($extension, $allowedExts))
    {
      if ($_FILES["file"]["error"][$f] > 0){
        echo "Return Code: " . $_FILES["file"]["error"][$f] . "<br>";
      } else {
        if (file_exists("uploads/" . $name)){
          echo "<p>File Already Exists</p>";
        } else {
          //create new directory folder within /uploads

          //move the files you upload into the new folder.
          move_uploaded_file($_FILES["file"]["tmp_name"][$f], "upload/" . uniqid() . "_" . $name);
          //send the file path to the database.
          mysql_query("INSERT INTO test (idtest,testing) VALUES (','{$filepath}'");
        }
      }
    } else {
      $error =  "Invalid file";
    }
  }
?>

对于那些好奇的人,这是我的数据库列:

|| idtest (AI, INT) || testing (varchart(50)) ||

任何帮助都非常感谢!它一直在帮我!提前谢谢!

2 个答案:

答案 0 :(得分:0)

鉴于您在move_command中即时生成了random-ish文件名,因此绝对有 NO 方法来保留数据库操作的随机/唯一名称。您生成随机名称,使用它,然后扔掉它。

你必须做

$filename = "upload/" . uniqid() . ....
move_uploaded_file(..., $filename);
mysql_query(".... $filename");

如果您尝试在查询中复制文件名生成逻辑,那么最终会得到两个完全不同的随机名称,这些名称彼此之间没有任何关系。

另外,你的file_exist()测试完全毫无意义。您将上传的文件移动到随机名称,但测试原始客户端文件名

e.g。

file_exists('kittens.jpg');
move_uploaded_file(..., 'uploads/kittens-345234523452345.jpg');

换句话说,你永远不会得到“文件存在”警告,因为你的碰撞检查从根本上被打破了。

答案 1 :(得分:0)

您应该使用mkdir()在代码顶部添加一个创建目录的方式。这只会被调用一次,一旦完成,您可以设置如何将文件移动到目录中:

<?php
//Create Subdirectory
  //Set the subdirectory name
  $subdir = $_POST['folderName'];

  //set the directory path name
  $dir = ("./uploads/" . $subdir);

  //make the directory
  (mkdir($dir, 0777);

//state your file type arguments
foreach ($_FILES['file']['name'] as $f => $name) {
 $allowedExts = array("gif", "jpeg", "jpg", "png");
 $temp = explode(".", $name);
 $extension = end($temp);
 //Set file type and size
  if ((($_FILES['file']['type'][$f] == "image/gif")
  || ($_FILES['file']['type'][$f] == "image/jpeg")
  || ($_FILES['file']['type'][$f] == "image/jpg")
  || ($_FILES['file']['type'][$f] == "image/png"))
  && ($_FILES['file']['size'][$f] < 1073741824)
  && in_array($extension, $allowedExts))
  {
   if ($_FILES['file']['error'][$f] > 0){
    echo "Return Code: " . $_FILES['file']['error'][$f] . "<br>";
   } else {
    //if the file exists within the directory
     if (file_exists($dir . $name)){
      echo "<p>File Already Exists</p>";
    } else {
      $names = $_FILES['file']['tmp_name'][$f];

      //move the files you upload into the newly generated folder.
      if (move_uploaded_file($names, "$dir/$name")){
        echo "<p>Moved</p>";
      } else {
        echo "<p>not moved</p>";
      }
      //send the file path to the database.

      echo "<meta http-equiv='refresh' content='2;url=test.php'>";
    }
   }
  } else {
   $error =  "Invalid file";
  }
 }
?> 

可重用的部分是您继续使用$ dir变量的地方。你应该确实检查安全性,但这是你可以做的基本方法。首先编写目录的代码,然后通过它循环文件。