如何使用PHP和MySQL進行多文件上傳

1 月 22, 2019 | | 0 條留言

在本教程中,我們將製作一個多文件上載PHP腳本,其中包含文件擴展名和大小的驗證,以進行安全上載並將文件信息保存到MySQL數據庫中。 在本教程中,我們將製作一個圖像上傳系統。這可用於上傳圖像,PDF,文檔,日誌或任何文件類型,確保您在腳本中進行更改。 如果您對文件上傳不熟悉,可以查看我們關於使用PHP進行簡單文件上傳的文章,以便開始使用基本知識。

HTML

這是一個簡單的HTML論壇,不會有任何樣式,因為我們專注於PHP上傳。

<form action="" enctype="multipart/form-data" method="POST">
    <input multiple="" name="files[]" type="file"></input>
    <input type="submit/"></input>
</form>

確保添加enctype="multipart/form-data,type="file"最重要的name="files[]"是可以選擇多文件。

PHP

繼續PHP代碼。我們可以在if條件下開始,以確保選擇一些文件。isset($_FILES[\’\’])

$_FILES[\’ \’] 將包含每個文件的信息,但是當選擇多個文件時,它將包含在另一個數組中的每個文件的詳細信息。

要查看數據如何存儲在數組中,請參閱我們使用PHP進行簡單文件上載的文章。

要訪問它們,我們將使用foreach。

foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
    $file_name = $key.$_FILES['files']['name'][$key];
    $file_size =$_FILES['files']['size'][$key];
    $file_tmp =$_FILES['files']['tmp_name'][$key];
    $file_type=$_FILES['files']['type'][$key];
}

現在來做驗證部分。首先,我們將創建一個包含允許擴展的數組。

$extensions = array(jpeg,jpg,png);   

在我們製作圖片上傳時,我們只需要允許圖片擴展名,例如 JPEG,PNG等。您可以添加所需的相應擴展名。要獲得上傳文件的擴展名,我們將使用文件名而不是文件類型,以獲得我們將使用PHP explode()&的擴展名end()。

擴展也可以是UPPER case或LOWER case來克服我們將它們轉換為小寫或大寫的問題,就像你在$extensions數組中提到的那樣。

使用PHP in_array()來驗證是否允許上傳的文件,它幾乎完成了。

$file_ext=explode('.',$_FILES['image']['name'][$key])   ;
$file_ext=end($file_ext);  
$file_ext=strtolower(end(explode('.',$_FILES['image']['name'][$key])));  
if(in_array($file_ext,$extensions ) === false){
     $errors[]=extension not allowed;
}     

要限制上載文件大小,$_FILES[\’image\’][\’size\’]將用於獲取文件大小。

if($_FILES['image']['size'][$key] > 2097152){
    $errors[]='File size must be less tham 2 MB';
}   

SQL

這就是上傳部分,文件已準備好移動到文件夾,並在必要時將文件詳細信息存儲在MySQL表中。在本教程中,我們使用一個包含4行的MySQL表

CREATE TABLE `upload_data` (
  `ID` int(5) NOT NULL AUTO_INCREMENT,
  `USER_CODE` int(4) unsigned zerofill NOT NULL,
  `FILE_NAME` varchar(200) NOT NULL,
  `FILE_SIZE` varchar(200) NOT NULL,
  `FILE_TYPE` varchar(200) NOT NULL,
  PRIMARY KEY (`ID`)
)

USER_CODE 如果您有基於用戶的應用程序或任何可識別每個項目的唯一ID,則每個用戶都是唯一的。

$query=INSERT into upload_data (`EMP_CODE`,`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`) VALUES('$codes','$file_name','$file_size','$file_type'); ;
# Make sure that the query is not executed unless the $errors array is empty.
mysql_query($query);

移動文件

上傳的文件將在php.ini中提到的臨時位置分配空間。有必要將文件從臨時位置移動到另一個位置以便再次使用它。您可以將文件移動到另一個位置使用move_uploaded_file(),在這裡我們將它移動到一個images文件夾,確保該目錄存在,因為move_uploaded_file()無法創建目錄。所以建議驗證目錄是否存在。

if(is_dir($dir)==false){
    move_uploaded_file($file_tmp,images/.$file_name);
}

如果您計劃為每個用戶創建一個目錄,則可以使用 mkdir(DIR NAME,PERMISION)

重命名文件

如果存在具有相同名稱的另一個文件,則用戶可能會產生問題,因為如果存在另一個文件, move_uploaded_file()則無法移動該文件。您可以重命名文件或重命名使用序列號上傳的所有文件,這可以完全防止此問題。隨著rename(OLD_FILE_NAME,NEW_FILE_NAME)。

OLD_FILE_PATH文件名,包含擴展名和位置以及 NEW_FILE_NAME新名稱。

#Check if a file of same name exist
if(is_dir(emp_data/$codes/.$file_name)==false){
    move_uploaded_file($file_tmp,$desired_dir/.$file_name);
}else{
    rename($file_tmp, $desired_dir/.$file_name);
    # rename can move the file along with renaming it
}

曲折

您可以使用以下代碼上傳任何大小和類型的文件,確保服務器上有足夠的空間。項目的完整代碼。

<?php if(isset($_FILES['files'])){
 $errors= array();
   foreach($_FILES['files']['tmp_name'] as $key =?> $tmp_name ){
    $file_name = $key.$_FILES['files']['name'][$key];
    $file_size =$_FILES['files']['size'][$key];
    $file_tmp =$_FILES['files']['tmp_name'][$key];
    $file_type=$_FILES['files']['type'][$key];  
        if($file_size > 2097152){
          $errors[]='File size must be less than 2 MB';
        }       
        $query=INSERT into upload_data (`USER_ID`,`FILE_NAME`,`FILE_SIZE`,`FILE_TYPE`) VALUES('$user_id','$file_name','$file_size','$file_type'); ;
        $desired_dir=user_data;
        if(empty($errors)==true){
          if(is_dir($desired_dir)==false){
            mkdir($desired_dir, 0700);        // Create directory if it does not exist
          }
          if(is_dir($desired_dir/.$file_name)==false){
              move_uploaded_file($file_tmp,user_data/.$file_name);
          }else{
         //rename the file if another one exist
              $new_dir=user_data/.$file_name.time();
               rename($file_tmp,$new_dir) ;             
           }
            mysql_query($query);            
        }else{
           print_r($errors);
        }
    }
    if(empty($error)){
     echo Success;
    }
}
?>
<form action="" enctype="multipart/form-data" method="POST">
 <input multiple="" name="files[]" type="file"></input>
 <input type="submit/"></input>
</form>

翻譯來源:https://techstream.org/Web-Development/PHP/Multiple-File-Upload-with-PHP-and-MySQL