您的位置:

PHP上传文件操作

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