当前位置:首页 > PHP

php实现文件上传下载

2026-02-13 18:32:33PHP

PHP 文件上传实现

创建 HTML 表单,设置 enctype="multipart/form-data" 以支持文件上传:

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

处理上传的 PHP 脚本 (upload.php):

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

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

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

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

// 检查错误并移动文件
if ($uploadOk == 1) {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
        echo "文件上传成功";
    } else {
        echo "上传失败";
    }
}

PHP 文件下载实现

创建下载链接:

<a href="download.php?file=example.pdf">下载文件</a>

处理下载的 PHP 脚本 (download.php):

$file = $_GET['file'] ?? '';
$filePath = "uploads/" . basename($file);

if (file_exists($filePath)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($filePath).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filePath));
    readfile($filePath);
    exit;
} else {
    echo "文件不存在";
}

安全注意事项

验证文件类型时不要仅依赖扩展名,应使用 finfo_file() 检测实际 MIME 类型:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES["fileToUpload"]["tmp_name"]);
finfo_close($finfo);

$allowedMimeTypes = ["image/jpeg", "image/png", "image/gif"];
if (!in_array($mime, $allowedMimeTypes)) {
    echo "无效的文件类型";
    $uploadOk = 0;
}

限制上传目录的执行权限,防止上传的脚本文件被执行:

// 在服务器配置中设置
<Directory "/path/to/uploads">
    php_flag engine off
</Directory>

大文件上传处理

对于大文件上传,可能需要调整 PHP 配置:

; php.ini 设置
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300

使用分块上传技术处理超大文件:

php实现文件上传下载

// 前端使用File API分割文件
// 后端接收并合并分块

分享给朋友:

相关文章

vue实现文件导入

vue实现文件导入

文件导入的基本实现 在Vue中实现文件导入通常通过HTML的<input type="file">元素结合File API完成。创建一个文件选择组件,监听change事件获取用户选择的文件…

vue预览文件实现

vue预览文件实现

实现文件预览功能 在Vue中实现文件预览功能可以通过多种方式完成,具体取决于文件类型(图片、PDF、文档等)和需求。以下是几种常见实现方法: 图片文件预览 使用HTML5的FileReader AP…

vue实现文件导入导出

vue实现文件导入导出

Vue 文件导入 在 Vue 中实现文件导入通常通过 <input type="file"> 元素结合 FileReader API 完成。 <template> <…

vue axios实现文件下载

vue axios实现文件下载

使用 Axios 实现文件下载 在 Vue 项目中,可以通过 Axios 发送请求实现文件下载功能。以下是具体实现方法: 发送 GET 请求下载文件 axios({ method: 'get',…

vue如何实现文件下载

vue如何实现文件下载

Vue 实现文件下载的方法 使用 <a> 标签下载 通过动态创建 <a> 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 对象的情况。…

react文件如何打开

react文件如何打开

打开 React 文件的方法 React 文件通常是 .jsx 或 .tsx 格式的组件文件,也可能是普通的 .js 或 .ts 文件。以下是打开和编辑这些文件的常见方法: 使用代码编辑器 Visu…