当前位置:首页 > PHP

php实现文件上传下载

2026-04-03 02:04:33PHP

PHP 文件上传实现

使用 $_FILES 超全局变量处理上传文件,表单需设置 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>

检查文件错误代码和类型,移动临时文件到目标目录。

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

if ($_FILES["fileToUpload"]["error"] != UPLOAD_ERR_OK) {
    $uploadOk = 0;
}

if (file_exists($targetFile)) {
    $uploadOk = 0;
}

if ($_FILES["fileToUpload"]["size"] > 500000) {
    $uploadOk = 0;
}

if ($uploadOk && move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
    echo "File uploaded successfully.";
} else {
    echo "Upload failed.";
}

PHP 文件下载实现

设置正确的 HTTP 头信息强制下载文件。

$filePath = 'uploads/sample.pdf';
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;
}

安全注意事项

验证文件类型时使用白名单方式。

$allowedTypes = ['jpg', 'png', 'pdf'];
if (!in_array($imageFileType, $allowedTypes)) {
    $uploadOk = 0;
}

重命名上传文件避免目录遍历攻击。

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

大文件上传处理

修改 php.ini 配置或使用分片上传。

upload_max_filesize = 20M
post_max_size = 20M

使用 JavaScript 分片上传示例。

php实现文件上传下载

// 前端分片处理逻辑
const chunkSize = 5 * 1024 * 1024; // 5MB
const file = document.getElementById('fileInput').files[0];
let offset = 0;

while (offset < file.size) {
    const chunk = file.slice(offset, offset + chunkSize);
    const formData = new FormData();
    formData.append('file', chunk);
    formData.append('name', file.name);
    formData.append('offset', offset);

    // 发送 AJAX 请求
    offset += chunkSize;
}

分享给朋友:

相关文章

vue实现word文件预览

vue实现word文件预览

vue实现word文件预览的方法 在Vue项目中实现Word文件预览,可以通过以下几种方式: 使用mammoth.js库 mammoth.js是一个将.docx文件转换为HTML的JavaScrip…

react如何新建leaa文件

react如何新建leaa文件

在React项目中新建.less文件(假设问题中的"leaa"是拼写错误,实际指.less文件)可以通过以下步骤实现: 安装less依赖 确保项目已安装less和less-loader。通过npm或…

react如何访问到public内的文件

react如何访问到public内的文件

访问 public 目录文件的常用方法 在 React 项目中,public 目录下的文件可以通过以下方式访问: 直接使用绝对路径 React 会自动将 public 目录作为根路径。例如,若文件位…

react如何打开一个静态文件

react如何打开一个静态文件

在React中打开静态文件的方法 React项目中静态文件通常存放在public目录下,可以通过以下方式访问: 将需要打开的静态文件(如PDF、图片等)放入项目的public文件夹中。假设文件名为e…

React实现浏览文件

React实现浏览文件

文件选择基础实现 使用HTML的<input type="file">元素结合React状态管理实现基础文件选择功能: import { useState } from 'react';…

旋转相册制作css文件

旋转相册制作css文件

旋转相册制作CSS文件 制作旋转相册主要依赖CSS的3D变换和动画功能。以下是一个完整的旋转相册CSS实现方案,包含关键代码和注释。 基础HTML结构 <div class="photo-…