在本教程中,您將學(xué)習(xí)如何使用PHP將文件上傳到遠(yuǎn)程Web服務(wù)器。
在本教程中,我們將學(xué)習(xí)如何使用簡單HTML表單和PHP上傳文件到遠(yuǎn)程服務(wù)器上。您可以上傳任何類型的文件,例如圖像,視頻,ZIP文件,Microsoft Office文檔,PDF,可執(zhí)行文件和其他各種文件類型。
以下示例將創(chuàng)建一個(gè)可用于上傳文件的簡單HTML表單。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>File Upload Form</title> </head> <form action="upload-manager.html" method="post" enctype="multipart/form-data"> <h2>Upload File</h2> <label for="fileSelect">Filename:</label> <input type="file" name="photo" id="fileSelect"> <input type="submit" name="submit" value="Upload"> <p><strong>Note:</strong>僅允許.jpg、.jpeg、.gif、.png格式,最大大小為5 MB。</p> </form> </html>
注意:除了文件選擇字段外,上載表單還必須使用HTTP post方法,并且必須包含一個(gè) enctype="multipart/form-data" 屬性。此屬性可確保將表單數(shù)據(jù)編碼為多段MIME數(shù)據(jù),這是上傳大量二進(jìn)制數(shù)據(jù)(例如圖像,音頻,視頻等)所必需的。
下面是我們的“Upload-manager.php”文件的完整代碼。 它將永久地將上傳的文件存儲(chǔ)在“upload”文件夾中,并執(zhí)行一些基本的安全檢查,如文件類型和文件大小,以確保用戶上傳正確的文件類型并在允許的限制內(nèi)。
<?php //檢查表單是否已提交 if($_SERVER["REQUEST_METHOD"] == "POST"){ // 檢查文件是否上傳成功 if(isset($_FILES["photo"]) && $_FILES["photo"]["error"] == 0){ $allowed = array("jpg" => "image/jpg", "jpeg" => "image/jpeg", "gif" => "image/gif", "png" => "image/png"); $filename = $_FILES["photo"]["name"]; $filetype = $_FILES["photo"]["type"]; $filesize = $_FILES["photo"]["size"]; // 驗(yàn)證文件擴(kuò)展名 $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!array_key_exists($ext, $allowed)) die("錯(cuò)誤:請(qǐng)選擇有效的文件格式。"); // 驗(yàn)證文件大小-最大5MB $maxsize = 5 * 1024 * 1024; if($filesize > $maxsize) die("錯(cuò)誤:文件大小大于允許的限制。"); // 驗(yàn)證文件的MIME類型 if(in_array($filetype, $allowed)){ // Check whether file exists before uploading it if(file_exists("upload/" . $filename)){ echo $filename . " is already exists."; } else{ move_uploaded_file($_FILES["photo"]["tmp_name"], "upload/" . $filename); echo "您的文件已成功上傳。"; } } else{ echo "錯(cuò)誤:上載您的文件時(shí)出現(xiàn)問題。 請(qǐng)?jiān)僭囈淮巍?quot;; } } else{ echo "Error: " . $_FILES["photo"]["error"]; } } ?>
注意:以上腳本可防止上傳與同一文件夾中現(xiàn)有文件同名的文件。但是,如果您想要允許這樣做,只需在文件名前面加上隨機(jī)字符串或時(shí)間戳,例如$filename = time() . '_' . $_FILES["photo"]["name"];
您可能想知道這段代碼是關(guān)于什么的。好吧,讓我們逐一遍歷此示例代碼的每個(gè)部分,以更好地理解此過程。
一旦表單被提交,有關(guān)上傳文件的信息就可以通過 PHP 超全局?jǐn)?shù)組 $_ FILES 訪問。例如,我們的上傳表單包含一個(gè)名為 photo 的文件選擇字段(即 name = " photo") ,如果任何用戶使用這個(gè)字段上傳文件,我們可以獲得它的詳細(xì)信息,比如名稱、類型、大小、臨時(shí)名稱,或者在嘗試上傳時(shí)通過 $FILES ["photo"]關(guān)聯(lián)數(shù)組發(fā)生的任何錯(cuò)誤,如下所示:
$_FILES["photo"]["name"] — 此數(shù)組值指定文件的原始名稱,包括文件擴(kuò)展名。它不包括文件路徑。
$_FILES["photo"]["type"] — 此數(shù)組值指定文件的MIME類型。
$_FILES["photo"]["size"] — 此數(shù)組值指定文件大小,以字節(jié)為單位。
$_FILES["photo"]["tmp_name"] — 該數(shù)組值指定了臨時(shí)名稱,包括在文件上載到服務(wù)器后即分配給該文件的完整路徑。
$_FILES["photo"]["error"] — 此數(shù)組值指定與文件上傳相關(guān)的錯(cuò)誤或狀態(tài)代碼,例如,如果沒有錯(cuò)誤,則為0。
以下示例中的PHP代碼將僅顯示上載文件的詳細(xì)信息,并將其存儲(chǔ)在Web服務(wù)器上的臨時(shí)目錄中。
<?php if($_FILES["photo"]["error"] > 0){ echo "錯(cuò)誤: " . $_FILES["photo"]["error"] . "<br>"; } else{ echo "文件名: " . $_FILES["photo"]["name"] . "<br>"; echo "文件類型: " . $_FILES["photo"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["photo"]["size"] / 1024) . " KB<br>"; echo "存儲(chǔ)在: " . $_FILES["photo"]["tmp_name"]; } ?>
提示:成功上傳文件后,該文件將自動(dòng)存儲(chǔ)在服務(wù)器上的臨時(shí)目錄中。 要永久存儲(chǔ)此文件,您需要使用PHP的move_uploaded_file()函數(shù)將其從臨時(shí)目錄移動(dòng)到永久位置。