随着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 上传文件。对于初学者来说,希望通过阅读本文来实践文件上传相关知识,掌握文件上传技巧,以便更好的应用到实际项目开发中。