通过浏览器将 YouTube 视频文件直接下载到用户计算机
Download the YouTube video file directly to user's computer through browser
<?php
$youtubeUrl = "https://www.youtube.com/watch?v=Ko2JcxecV2E";
$content = json_encode ($file = shell_exec("youtube-dl.exe $youtubeUrl "));
$input_string =$content;
$regex_pattern = "/Destination:(.*.mp4)/";
$boolean = preg_match($regex_pattern, $input_string, $matches_out);
$extracted_string=$matches_out[0];
$file =explode(': ',$extracted_string,2)[1];
// Quick check to verify that the file exists
if( !file_exists($file) ) die("File not found");
// Force the download
header("Content-Disposition: attachment; filename=\"$file\"" );
header("Content-Length: " . filesize($file));
header("Content-Type: application/octet-stream;");
readfile($file);
?>
当我 运行 这个文件时,相应的 YouTube 视频首先使用 youtube-dl.exe
下载到这个 PHP 文件所在的本地主机服务器文件夹,然后从该文件夹推送到浏览器下载(强制下载)。
如何直接开始下载到用户的浏览器?
此外,该文件 运行 在本地主机上正常,但在远程服务器上不正常。
问题大概在:shell_exec("youtube-dl.exe $youtubeUrl ")
首先,一些主机出于安全原因禁用 shell_exec。
其次,youtube-dl.exe 看起来可能是一个 windows 脚本,而您的远程服务器可能是基于 Linux 的。
首先,您需要为您的网络服务器平台使用 youtube-dl 版本。 youtube-dl.exe
是 Windows 的构建,而大多数网站托管使用 Linux.
然后使用passthru
PHP function to run the youtube-dl
with the -o -
command-line parameter。参数使 youtube-dl
将下载的视频输出到其标准输出,而 passthru
将标准输出传递到浏览器。
您还需要在 passthru
之前输出 headers。请注意,在这种情况下您无法知道下载大小。
header("Content-Disposition: attachment; filename=\"...\"" );
header("Content-Type: application/octet-stream");
passthru("youtube-dl -o - $youtubeUrl");
如果您需要视频元数据(如文件名),您可以先 运行 youtube-dl
和 -j
command-line 参数以获得 JSON 没有下载视频的数据。
您还需要 1) Web 服务器上的 Python 解释器 2) 能够使用 passthru
功能 3) 从 PHP 脚本连接到 YouTube。所有这些通常都受到虚拟主机的限制。
<?php
$youtubeUrl = "https://www.youtube.com/watch?v=Ko2JcxecV2E";
$content = json_encode ($file = shell_exec("youtube-dl.exe $youtubeUrl "));
$input_string =$content;
$regex_pattern = "/Destination:(.*.mp4)/";
$boolean = preg_match($regex_pattern, $input_string, $matches_out);
$extracted_string=$matches_out[0];
$file =explode(': ',$extracted_string,2)[1];
// Quick check to verify that the file exists
if( !file_exists($file) ) die("File not found");
// Force the download
header("Content-Disposition: attachment; filename=\"$file\"" );
header("Content-Length: " . filesize($file));
header("Content-Type: application/octet-stream;");
readfile($file);
?>
当我 运行 这个文件时,相应的 YouTube 视频首先使用 youtube-dl.exe
下载到这个 PHP 文件所在的本地主机服务器文件夹,然后从该文件夹推送到浏览器下载(强制下载)。
如何直接开始下载到用户的浏览器?
此外,该文件 运行 在本地主机上正常,但在远程服务器上不正常。
问题大概在:shell_exec("youtube-dl.exe $youtubeUrl ")
首先,一些主机出于安全原因禁用 shell_exec。
其次,youtube-dl.exe 看起来可能是一个 windows 脚本,而您的远程服务器可能是基于 Linux 的。
首先,您需要为您的网络服务器平台使用 youtube-dl 版本。 youtube-dl.exe
是 Windows 的构建,而大多数网站托管使用 Linux.
然后使用passthru
PHP function to run the youtube-dl
with the -o -
command-line parameter。参数使 youtube-dl
将下载的视频输出到其标准输出,而 passthru
将标准输出传递到浏览器。
您还需要在 passthru
之前输出 headers。请注意,在这种情况下您无法知道下载大小。
header("Content-Disposition: attachment; filename=\"...\"" );
header("Content-Type: application/octet-stream");
passthru("youtube-dl -o - $youtubeUrl");
如果您需要视频元数据(如文件名),您可以先 运行 youtube-dl
和 -j
command-line 参数以获得 JSON 没有下载视频的数据。
您还需要 1) Web 服务器上的 Python 解释器 2) 能够使用 passthru
功能 3) 从 PHP 脚本连接到 YouTube。所有这些通常都受到虚拟主机的限制。