当前位置:首页 > PHP

php实现上传实例

2026-02-14 00:31:30PHP

PHP 文件上传基础实现

创建一个简单的文件上传表单,使用 enctype="multipart/form-data" 确保文件数据正确传输:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload File" name="submit">
</form>

处理上传的 PHP 脚本(upload.php)核心代码:

$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
    echo "The file ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])). " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

安全增强措施

设置文件大小限制,防止过大文件上传:

$maxFileSize = 500000; // 500KB
if ($_FILES["fileToUpload"]["size"] > $maxFileSize) {
    die("File is too large.");
}

限制允许的文件类型,只接受图片:

$allowedTypes = ["jpg", "png", "jpeg", "gif"];
$fileExtension = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));

if (!in_array($fileExtension, $allowedTypes)) {
    die("Only JPG, JPEG, PNG & GIF files are allowed.");
}

文件重命名处理

生成唯一文件名防止覆盖和注入攻击:

$newFileName = uniqid() . '.' . $fileExtension;
$targetFile = $targetDir . $newFileName;

完整示例代码

结合所有安全检查的完整处理脚本:

$targetDir = "uploads/";
$maxFileSize = 500000;
$allowedTypes = ["jpg", "png", "jpeg", "gif"];

if(isset($_POST["submit"])) {
    $fileExtension = strtolower(pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_EXTENSION));
    $newFileName = uniqid() . '.' . $fileExtension;
    $targetFile = $targetDir . $newFileName;

    // 检查文件类型
    if (!in_array($fileExtension, $allowedTypes)) {
        die("Error: Only image files are allowed.");
    }

    // 检查文件大小
    if ($_FILES["fileToUpload"]["size"] > $maxFileSize) {
        die("Error: File is too large.");
    }

    // 移动临时文件到目标位置
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
        echo "The file has been uploaded as " . htmlspecialchars($newFileName);
    } else {
        echo "Error: There was an error uploading your file.";
    }
}

高级安全处理

添加图像验证确保上传的是真实图片:

$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check === false) {
    die("Error: File is not an actual image.");
}

设置更严格的权限:

chmod($targetFile, 0644); // 设置文件权限为所有者可读写,其他只读

错误处理机制

完善错误捕获和处理:

if ($_FILES["fileToUpload"]["error"] !== UPLOAD_ERR_OK) {
    switch($_FILES["fileToUpload"]["error"]) {
        case UPLOAD_ERR_INI_SIZE:
            die("Error: File exceeds server size limit.");
        case UPLOAD_ERR_FORM_SIZE:
            die("Error: File exceeds form size limit.");
        // 其他错误情况处理...
        default:
            die("Error: Unknown upload error.");
    }
}

php实现上传实例

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

相关文章

jquery上传

jquery上传

jQuery 文件上传的实现方法 jQuery 可以通过多种方式实现文件上传功能,以下介绍几种常见的方法: 使用原生表单和 AJAX 通过 HTML 表单结合 jQuery 的 AJAX 功能实现文…

vue实现上传进度

vue实现上传进度

Vue 实现文件上传进度 在 Vue 中实现文件上传进度可以通过 XMLHttpRequest 或 axios 的 onUploadProgress 事件来监听上传进度。以下是两种常见实现方式:…

vue实现切片上传

vue实现切片上传

切片上传的实现原理 切片上传是将大文件分割成多个小块(切片)分别上传,最后在服务端合并。这种方式能提高上传效率、支持断点续传和并发上传。 前端实现步骤 使用Vue实现切片上传需要借助File对象…

vue实现上传按钮

vue实现上传按钮

Vue 实现上传按钮的方法 使用原生 HTML input 和 Vue 处理 通过 HTML 的 input 元素结合 Vue 的事件处理实现文件上传功能。 <template>…

vue java实现分片上传

vue java实现分片上传

分片上传的实现原理 分片上传是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能解决大文件上传超时、网络不稳定等问题,同时支持断点续传。 前端Vue实现 前端需要使用File API…

vue实现列表批量上传

vue实现列表批量上传

批量上传列表的实现方法 前端部分(Vue.js) 使用<input type="file">元素配合multiple属性实现多文件选择 <template> <…