引言

前端准备

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="image" />
    <input type="submit" value="上传图片" />
</form>

在这个表单中,enctype="multipart/form-data" 是关键属性,它允许我们上传文件。

后端处理

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["image"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

// 检查文件是否为图片
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["image"]["tmp_name"]);
    if($check !== false) {
        echo "文件是一个图片 - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "文件不是一个图片.";
        $uploadOk = 0;
    }
}

// 检查文件是否已存在
if (file_exists($target_file)) {
    echo "文件已存在。";
    $uploadOk = 0;
}

// 检查文件大小
if ($_FILES["image"]["size"] > 500000) {
    echo "文件太大。";
    $uploadOk = 0;
}

// 允许特定格式的图片
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "不支持的文件格式。";
    $uploadOk = 0;
}

// 检查是否有错误发生
if ($uploadOk == 0) {
    echo "文件没有被上传。";
// 如果一切顺利,尝试上传文件
} else {
    if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) {
        echo "文件 " . htmlspecialchars(basename( $_FILES["image"]["name"])). " 已成功上传。";
    } else {
        echo "文件上传失败。";
    }
}
?>

高效上传技巧

    使用分片上传:对于大文件上传,可以考虑使用分片上传技术,将大文件分割成多个小文件片段进行上传,提高上传效率。

    异步上传:使用JavaScript和AJAX技术实现异步上传,提升用户体验。

    上传频率:为了防止滥用,可以用户上传的频率和数量。