PHP视频下载工具:如何避免根目录留存下载文件副本?
解决PHP视频下载工具根目录留存副本问题
你的问题根源是当前代码会先把远程视频文件保存到服务器根目录,再输出给用户,且未清理本地文件,导致留存副本。要解决这个问题,跳过服务器本地存储步骤,直接将远程文件内容输出给浏览器即可,无需在服务器创建文件副本。
改进后的代码实现
function df($urlFile) { // 获取远程文件的原始文件名 $file_name = basename($urlFile); // 获取远程文件的HTTP头信息,用于适配正确的响应头 $file_headers = get_headers($urlFile, true); // 输出缓存控制相关HTTP头 header("Expires: 0"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); // 动态设置Content-Type,适配视频/图片等不同文件类型 if (!empty($file_headers['Content-Type'])) { header("Content-type: " . $file_headers['Content-Type']); } else { // 当无法获取远程类型时,使用通用二进制类型 header("Content-type: application/octet-stream"); } // 设置文件大小(如果远程服务器返回该信息) if (!empty($file_headers['Content-Length'])) { header('Content-length: ' . $file_headers['Content-Length']); } // 设置下载文件名,触发浏览器下载行为 header('Content-disposition: attachment; filename="' . $file_name . '"'); // 直接输出远程文件内容,不保存到服务器本地 readfile($urlFile); } df($main_url);
关键改进点
- 移除
file_put_contents本地存储步骤,用readfile直接输出远程文件内容,服务器不会生成任何本地副本。 - 动态获取远程文件的
Content-Type和Content-Length,避免硬编码为image/jpg,适配MP4等视频格式。 - 保留原有的缓存控制头,确保浏览器正确处理下载请求。
注意事项
- 确保PHP配置中
allow_url_fopen已开启(默认通常为开启状态),否则readfile无法读取远程URL。 - 如果需要对视频内容做预处理(如加水印),可将文件读取到内存中处理后再输出,依然不要保存到本地磁盘。
内容的提问来源于stack exchange,提问作者Rudy
相关产品推荐
相关产品推荐

