2014-08-28 41 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