You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP网站实现PDF下载时保留服务器路径结构保存至用户本地

PHP网站实现PDF下载时保留服务器路径结构保存至用户本地

嘿,我来帮你搞定这个需求!要让用户下载PDF时自动保留服务器上的路径结构(比如服务器上是all-pdfs/gardens/lights/green-lights.pdf,用户下载后保存为Downloads/all-pdfs/gardens/lights/green-lights.pdf),核心就是通过设置正确的HTTP响应头,让浏览器识别并创建对应的文件夹层级。下面是具体的实现方案:

核心思路

现代浏览器支持在Content-Disposition响应头的filename参数中包含路径信息,当用户下载文件时,浏览器会自动在本地下载文件夹下创建对应的子目录,并把文件保存到指定路径里。我们只需要构造好这个带路径的文件名,再配合安全校验和文件输出逻辑即可。

完整代码实现

<?php
// 从GET参数获取用户请求的PDF相对路径(示例值:gardens/lights/green-lights.pdf)
$requestedFile = isset($_GET['file']) ? trim($_GET['file']) : '';

// 服务器上PDF文件的根目录(请根据你的实际部署路径调整)
$serverPdfRoot = $_SERVER['DOCUMENT_ROOT'] . '/all-pdfs/';

// 拼接出服务器上的完整文件路径
$fullServerPath = $serverPdfRoot . $requestedFile;

// 安全校验1:检查文件是否真实存在且是合法文件
if (!file_exists($fullServerPath) || !is_file($fullServerPath)) {
    http_response_code(404);
    echo "抱歉,请求的PDF文件不存在";
    exit;
}

// 安全校验2:防止路径遍历攻击,确保请求的文件在允许的目录范围内
$allowedDir = realpath($serverPdfRoot);
$realFilePath = realpath($fullServerPath);
if (strpos($realFilePath, $allowedDir) !== 0) {
    http_response_code(403);
    echo "无权访问该文件";
    exit;
}

// 构造用户本地保存的路径:Downloads/ + 服务器上的完整相对路径
$localSavePath = 'Downloads/all-pdfs/' . $requestedFile;

// 设置下载相关的HTTP响应头
header('Content-Type: application/pdf');
// 关键:通过filename指定带层级的保存路径
header('Content-Disposition: attachment; filename="' . $localSavePath . '"');
// 告诉浏览器文件的大小,提升下载体验
header('Content-Length: ' . filesize($fullServerPath));
// 禁用缓存,确保用户下载的是最新版本的文件
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

// 将文件内容输出到浏览器,触发下载
readfile($fullServerPath);
exit;
?>

重要注意事项

  • 安全第一:一定要保留路径校验的代码!如果跳过realpath的校验,恶意用户可能通过构造../../../../etc/passwd这样的参数来访问服务器上的敏感文件,造成数据泄露。
  • 浏览器兼容性:Chrome、Firefox、Edge等主流现代浏览器都完美支持这种带路径的文件名,但部分老旧浏览器可能不识别路径结构,只会保存文件名。你可以在下载按钮旁加个小提示,告诉用户如果路径没自动生成,可以手动将文件保存到Downloads/all-pdfs/...目录下。
  • 文件权限:确保服务器上的PDF文件和所属目录有可读权限,PHP进程需要能读取这些文件才能正常输出。

备注:内容来源于stack exchange,提问作者Jigar Dhaduk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 09:43:13