当前位置:首页 > 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;
}

分享给朋友:

相关文章

java如何创建文件

java如何创建文件

使用 File 类创建文件 通过 File 类的 createNewFile() 方法创建文件。此方法返回布尔值,表示文件是否成功创建。 import java.io.File; import ja…

php下载文件实现

php下载文件实现

PHP 下载文件实现方法 使用 header() 函数强制下载 设置合适的 HTTP 头信息,强制浏览器下载文件而非直接打开。 $file_path = '/path/to/file.pdf'; $…

vue实现文件管理系统

vue实现文件管理系统

Vue 文件管理系统实现方案 核心功能模块设计 文件展示组件:使用树形结构展示目录层级,配合递归组件实现无限嵌套 上传下载功能:通过axios与后端API交互,支持拖拽上传和分片上传 权限控制系统:基…

vue语音文件播放实现

vue语音文件播放实现

实现语音文件播放的方法 在Vue中实现语音文件播放可以通过HTML5的<audio>元素或JavaScript的Audio对象来完成。以下是几种常见的实现方式。 使用HTML5的audi…

vue实现拖动文件移动

vue实现拖动文件移动

Vue 实现文件拖动移动 实现文件拖动移动功能通常涉及 HTML5 的拖放 API 和 Vue 的事件处理。以下是具体实现方法: 基础拖放实现 在 Vue 组件中设置拖放区域并处理相关事件: &l…

vue实现word文件预览

vue实现word文件预览

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