2014-08-28 77 views
0

我一直在为如何在不超载系统的情况下将多张照片上传到数据库中的日子一直在寻找答案,并决定最好的方法是将多张照片上传到新创建的目录(通过php创建)并将目录链接存储在数据库中。我正在处理的是一个基本上创建一个新的独特页面的表单。这个独特的页面有一组独特的照片,因此我需要在每次生成页面时生成一个文件夹,并将路径链接上载到数据库!我怎么做???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"; 
    } 
    } 
?> 

,并为那些好奇,这里是我的数据库collumns:

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

任何帮助IMMENSELY赞赏!它一直在帮我!先谢谢你!

+0

这是一个强制性的注释,提醒您在解决当前问题后放弃用'mysql'函数代替'mysqli'或'PDO'库。 – castis 2014-08-28 18:19:56

+0

是的!我完全忘了!猜旧的习惯会死硬,呵呵..:P顺便说一下,mysqli_query = mysql_query,不过吧? – 2014-08-28 18:40:55

+0

[mysqli库](http://php.net/manual/en/mysqli.quickstart.php)文档有关该主题的丰富知识。我不知道是否简单地改变函数名称会产生相同的输出。 – castis 2014-08-28 20:52:59

回答

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变量的一部分。你应该真的检查安全性,但这是你可以做的基本方法。首先创建目录的代码,然后通过它循环文件。

0

鉴于您在move_command中即时生成随机文件的文件名,绝对有保留数据库操作的随机/唯一名称的方法。您生成随机名称,使用它,然后将其丢弃。

你要做

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

如果你试图简单地复制在您的查询的文件名生成逻辑,你最终与拥有彼此没有关系是两个完全不同的随机名称。

另外,您的file_exist()测试完全没有意义。您正在将上传的文件移动到随机名称,但要测试原始客户端文件名,例如

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

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

+0

不一定。如果目录链接在数据库中可用,并且该文件夹存在于服务器中,我总是可以返回,调用该目录并重新创建它。检查文件是否存在需要首先扩展到“如果该目录存在,则文件存在”测试。 – 2014-08-28 18:42:55