如何设置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
相关产品推荐
相关产品推荐

