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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:20:41