在本教程中,我們將製作一個多文件上載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