元素允许用户选择文件。…">
当前位置:首页 > PHP

php实现上传实例

2026-02-27 23:27:17PHP

文件上传表单设计

在HTML中创建一个表单,设置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" value="上传">
</form>

服务器端处理脚本

创建upload.php文件处理上传逻辑。通过$_FILES超全局数组获取上传文件信息,包括临时路径、大小、类型等。

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

// 检查文件是否为真实图片(可选)
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["file"]["tmp_name"]);
    if($check !== false) {
        $uploadOk = 1;
    } else {
        echo "文件不是有效的图片。";
        $uploadOk = 0;
    }
}

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

// 限制文件大小(例如5MB)
if ($_FILES["file"]["size"] > 5000000) {
    echo "文件过大。";
    $uploadOk = 0;
}

// 允许特定文件格式
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg") {
    echo "仅支持JPG, JPEG, PNG文件。";
    $uploadOk = 0;
}

// 最终处理
if ($uploadOk == 0) {
    echo "文件未上传。";
} else {
    if (move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)) {
        echo "文件". htmlspecialchars(basename($_FILES["file"]["name"])). "已上传。";
    } else {
        echo "上传过程中出现错误。";
    }
}
?>

安全增强措施

为防止安全漏洞,需添加以下防护:

  • 验证文件类型通过MIME类型而非仅扩展名
  • 生成随机文件名避免覆盖冲突
  • 设置上传目录不可执行
// 生成随机文件名
$newFileName = uniqid().'.'.$imageFileType;
$targetFile = $targetDir . $newFileName;

// 更严格的类型检查
$allowedTypes = ['image/jpeg', 'image/png'];
if(!in_array($_FILES["file"]["type"], $allowedTypes)) {
    die("不允许的文件类型");
}

错误处理机制

完善错误处理以提供更好的用户体验:

if ($_FILES["file"]["error"] > 0) {
    switch($_FILES["file"]["error"]) {
        case UPLOAD_ERR_INI_SIZE:
            echo "文件超过服务器限制大小";
            break;
        case UPLOAD_ERR_FORM_SIZE:
            echo "文件超过表单限制大小";
            break;
        // 其他错误代码处理...
        default:
            echo "未知错误";
    }
}

文件保存优化

对于大文件或高并发场景,可考虑:

php实现上传实例

  • 分块上传处理
  • 使用云存储服务
  • 异步处理队列
// 示例:分片上传处理
if (isset($_POST['chunk']) && isset($_POST['chunks'])) {
    $tempDir = "temp/";
    $tempFile = $tempDir . $_POST['filename'] . '.part' . $_POST['chunk'];

    move_uploaded_file($_FILES["file"]["tmp_name"], $tempFile);

    if ($_POST['chunk'] == $_POST['chunks'] - 1) {
        // 所有分片上传完成,合并文件
        $finalFile = $targetDir . $_POST['filename'];
        $out = fopen($finalFile, "wb");

        for ($i = 0; $i < $_POST['chunks']; $i++) {
            $partFile = $tempDir . $_POST['filename'] . '.part' . $i;
            $in = fopen($partFile, "rb");
            while ($buff = fread($in, 4096)) {
                fwrite($out, $buff);
            }
            fclose($in);
            unlink($partFile);
        }
        fclose($out);
    }
}

标签: 实例上传
分享给朋友:

相关文章

vue实现上传

vue实现上传

Vue 实现文件上传 在 Vue 中实现文件上传功能可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的数据绑定和事件处理来实现。以下是几种常见的实现…

jquery 上传

jquery 上传

jQuery 文件上传方法 使用 jQuery 实现文件上传可以通过多种方式完成,以下是常见的几种方法: 使用原生表单和 AJAX 创建一个包含文件输入的表单,并通过 jQuery 的 AJAX…

vue实现上传头像

vue实现上传头像

使用 Vue 实现上传头像 前端实现 创建一个文件上传组件,使用 <input type="file"> 元素选择文件,并通过 FileReader 预览图片。 <template…

vue实现视频上传

vue实现视频上传

Vue 实现视频上传的方法 使用原生 input 元素和 FormData 在 Vue 中可以通过原生 input 元素结合 FormData 实现视频上传功能。创建一个文件选择输入框,监听文件变化事…

vue实现上传头像显示

vue实现上传头像显示

Vue 实现上传头像并显示 前端实现(Vue 3 + Element Plus) 模板部分 <template> <div class="avatar-upload">…

Vue实现图片批量上传

Vue实现图片批量上传

Vue 图片批量上传实现方法 准备工作 安装必要依赖(如axios、element-ui等),确保项目基于Vue 2/3环境。以Vue 3 + Element Plus为例: npm install…