隨着Web應用程序的發展,文件上傳是一個常見但關鍵的功能之一。在老舊的Web應用程序中,文件上傳是一個很難處理的步驟,但今天在PHP中,上傳文件非常簡單。
一、上傳文件到服務器
上傳文件是通過HTTP協議、POST方法實現的。HTML中的<form>標記可以製作表單。使用 enctype=”multipart/form-data” 屬性指定的表單能夠上傳二進制文件,要上傳的文件通過 input type=”file” 標籤指定。
<form action="upload.php" method="post" enctype="multipart/form-data">
<label for="file">文件上傳:</label>
<input type="file" name="file" id="file">
<input type="submit" name="submit" value="上傳">
</form>
通過 PHP 腳本處理上傳文件,使用 $_FILES 變量。$_FILES 是前面表單中 input type=”file” 標籤的名稱 required.
<?php
$target_dir = "uploads/"; //定義上傳文件存儲目錄
$target_file = $target_dir . basename($_FILES["file"]["name"]); //獲取上傳的文件名
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); //獲取上傳的文件擴展名
// 檢查文件是否存在
if (file_exists($target_file)) {
echo "文件已存在";
$uploadOk = 0;
}
// 檢查文件大小
if ($_FILES["file"]["size"] > 500000) {
echo "文件過大";
$uploadOk = 0;
}
// 允許特定文件格式上傳
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "僅允許上傳 JPG, JPEG, PNG & GIF 文件";
$uploadOk = 0;
}
// 檢查上傳是否成功
if ($uploadOk == 0) {
echo "上傳失敗";
} else {
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
echo "文件上傳成功";
} else {
echo "上傳失敗";
}
}
?>
二、文件上傳錯誤處理
在上傳文件過程中可能會出現錯誤,需要做一些錯誤處理工作,理解這些錯誤常常需要調試代碼並查看 HTTP 錯誤代碼。以下是一些常見的上傳文件錯誤信息:
- UPLOAD_ERR_INI_SIZE:文件太大,超過了 PHP 指令中 upload_max_filesize 的值。
- UPLOAD_ERR_FORM_SIZE:文件太大,超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
- UPLOAD_ERR_PARTIAL:文件只有部分被上傳。
- UPLOAD_ERR_NO_FILE:沒有文件被上傳。
- UPLOAD_ERR_NO_TMP_DIR:缺少臨時文件夾。
- UPLOAD_ERR_CANT_WRITE:無法寫入到磁盤。
- UPLOAD_ERR_EXTENSION:PHP擴展阻止了文件上傳。
通過檢查 $_FILES[‘file’][‘error’] 變量來確定上傳是否成功,返回 ERR_OK 表示上傳成功,返回其他值表示上傳失敗。
<?php
if ($_FILES['file']['error'] == UPLOAD_ERR_OK) {
// 此時變量$_FILES['file']['tmp_name']中存儲着上傳文件的臨時文件名
$name = $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $name);
echo "文件上傳成功";
} else {
// 文件上傳失敗
switch ($_FILES['file']['error']) {
case UPLOAD_ERR_INI_SIZE:
echo "上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。";
break;
case UPLOAD_ERR_PARTIAL:
echo "文件上傳不完整。";
break;
case UPLOAD_ERR_NO_FILE:
echo "沒有文件被上傳。";
break;
default:
echo "文件上傳失敗,請重新嘗試上傳。";
}
}
?>
三、將上傳文件發送到郵箱
文件上傳後,可以通過Email發送上傳文件。PHP 通過內置的 mail() 函數可輕鬆發送電子郵件,這個函數需要在服務器中安裝並配置電子郵件服務器。
<?php
$to = "johndoe@example.com";
$subject = "有新的文件上傳";
$message = "請查收新上傳的文件。...";
$file = "uploads/文件名.jpg"; //附件文件路徑
$filename = "文件名.jpg"; //附件名稱
$content = file_get_contents($file);
$content = chunk_split(base64_encode($content));
// 頭部信息
$uid = md5(uniqid(time()));
$header = "From: webmaster@example.com" . "\r\n";
$header .= "Reply-To: webmaster@example.com" . "\r\n";
$header .= "MIME-Version: 1.0" . "\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
$body = "--" . $uid . "\r\n";
$body .= "Content-Type: text/plain; charset=UTF-8\r\n";
$body .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
$body .= $message . "\r\n";
$body .= "--" . $uid . "\r\n";
$body .= "Content-Type: application/octet-stream\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n";
$body .= $content . "\r\n";
$body .= "--" . $uid . "--";
if (mail($to, $subject, $body, $header)) {
echo "電子郵件已發送至 $to";
} else {
echo "發送郵件失敗,請稍後再試。";
}
?>
四、使用Ajax上傳文件
在不刷新頁面的情況下上傳文件,可以使用Ajax。HTML5 提供了一個新的 JavaScript API:FormData。使用 FormData 對象進行 Ajax 文件上傳:
<script>
var formData = new FormData();
var fileField = document.querySelector("input[type='file']");
formData.append('file', fileField.files[0]);
var xhr = new XMLHttpRequest();
xhr.open("POST", "upload.php");
xhr.send(formData);
</script>
為了避免頁面刷新,我們可以用 jQuery 的 Ajax 方法來完成文件上傳。jQuery FormData 也可以使用這樣的方式向服務器發送表單數據和二進制文件。
<script>
$(document).ready(function(){
$('form').submit(function(event){
event.preventDefault();
var formData = new FormData($('form')[0]);
$.ajax({
url: 'upload.php',
type: 'POST',
data: formData,
processData: false,
contentType: false,
success: function(data){
alert(data);
},
error: function(jqXHR, textStatus, errorThrown){
console.log(textStatus, errorThrown);
}
});
});
});
</script>
五、總結
本文講解了如何使用 PHP 進行文件上傳,並對常見的上傳文件錯誤進行了處理。還講解了如何通過電子郵件發送上傳文件、使用 Ajax 上傳文件。對於初學者來說,希望通過閱讀本文來實踐文件上傳相關知識,掌握文件上傳技巧,以便更好的應用到實際項目開發中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/305233.html