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

如何设置PHP将MySQL数据库备份文件下载保存到D盘指定目录

问题根因

现有代码无法将备份存到D盘指定目录,是3个写法错误导致的:

  • 初始写入备份时用的是无路径的文件名,文件默认生成在PHP当前运行目录(项目文件夹),根本没写到目标盘
  • file_put_contents('D:\dbbackups', $backup_file_name); 用法完全错误:该函数第一个参数必须是带文件名的完整存储路径,不能只传文件夹路径;第二个参数是要写入的文件内容,不是文件名字符串,这行代码只会在D盘生成一个叫dbbackups的无后缀文件,内容是备份文件名,完全不是备份文件本身
  • 最后删除临时文件用的是Linux系统的rm命令,Windows环境下无法执行,而且也没针对目标路径做处理。
修正代码

首先提前手动创建D:\dbbackups文件夹,给Web服务运行账号(IIS对应IUSR、Apache/Nginx对应运行服务的系统用户)开该文件夹的读写权限,然后替换成如下代码:

// 定义目标存储目录,用系统目录分隔符避免转义问题
$targetDir = 'D:' . DIRECTORY_SEPARATOR . 'dbbackups' . DIRECTORY_SEPARATOR;
$backupFileName = $database_name . '_backup_' . time() . '.sql';
// 拼接完整的目标文件存储路径
$targetFilePath = $targetDir . $backupFileName;

// 直接将备份SQL内容写入D盘目标路径,不再在项目目录生成临时文件
$fileHandler = fopen($targetFilePath, 'w+');
fwrite($fileHandler, $sqlScript);
fclose($fileHandler);

// 浏览器下载逻辑
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $backupFileName);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($targetFilePath));
ob_clean();
flush();
// 读取目标路径的备份文件输出到浏览器
readfile($targetFilePath);

// 不需要在服务器留存备份就取消下面行的注释,Windows删除文件用del命令,参数要做转义避免空格等特殊字符报错
// exec('del ' . escapeshellarg($targetFilePath));
补充说明
  • 如果需要在D盘永久留存备份文件,直接保留文件即可,不要加删除逻辑
  • 写入失败优先检查文件夹权限:Web服务的运行用户必须有目标文件夹的写入、修改权限,否则会报权限拒绝错误
  • 所有文件操作函数都必须传入完整的「目录+文件名」路径,不能只传文件夹路径。

内容的提问来源于stack exchange,提问作者Shanu k k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:33:11