使用PHP脚本下载远程文件

    技术2022-05-11  43

    使用PHP脚本来下载文件,无非是通过两种方式,一种是使用systemexec等即有的函数调用系统自带的下载工具,比如 wget 之类的来下载文件,还有一种是使用php本身利用Socket来下载文件,我选择第二种方式。

    使用Socket下载文件,首先如果是http协议的文件,必须明白HTTP协议的运行过程,如果是FTP协议的则要了解ftp协议运行过程,比较繁琐。比如HTTP协议访问一个文件的代码:(来自手册)


    <?php$fp fsockopen("www.example.com"80$errno$errstr30);if (!$fp) {    echo "$errstr ($errno)<br />/n";} else {    $out "GET / HTTP/1.1/r/n";    $out .= "Host: www.example.com/r/n";    $out .= "Connection: Close/r/n/r/n";    fwrite($fp$out);    while (!feof($fp)) {        echo fgets($fp128);    }    fclose($fp);}?>

     

     

    我们为了简单起见,使用fopen直接访问远程文件来达到目的,同事又能够访问http,也能访问ftp,比较合适。当然,如果按照上面的思路来说,也可以使用ftp的函数库来实现。

    我们使用fopen函数来完成我们的工作,实现了如下代码:   


    #! /usr/bin/php<?phperror_reporting(0);set_time_limit(0);//无参数则给出提示if ($argc 2){    echo "Usage: "$argv[0] ." URL [Destination]/n/n";    exit();}//设置获取基本变量$url $argv[1];$save_path $argv[2] ? $argv[2] : "./";$file_name array_pop(explode("/"$url));$localfile $save_path $file_name;//检查变量if (!check_url($url)){    exit("Error: URL "$url ." invalid./n/n");}if (file_exists($localfile)){    exit("Error: local file "$localfile ." exists./n/n");}//打开远程文件$fp fopen($url"rb");if (!$fp){    exit("Error: Download "$url ." failed./n/n");}//打开本地文件$sp fopen($localfile"wb");if (!$sp){    exit("Error: Open local file "$localfile ." failed./n/n");}//下载远程文件echo "Downloading, please waiting.../n/n";while (!feof($fp)){    $tmpfile .= fread($fp1024);}//保存文件到本地fwrite($sp$tmpfile);fclose($fp);fclose($sp);echo "Download file "$file_name ." succeed!/n/n";/* 检查URL合法性函数 */function check_url($url){    return preg_match("/^(http|ftp)(:)([a-zA-Z0-9-_]+[/.//]+[/w/-_//]+.*)+$/i"$url);    }?>  

     我们把以上代码保存为 download.php 文件,在Linux/Unix下记得要加上可执行属性:chmod +x download.php另外,PHP脚本引擎的路径必须是 /usr/bin/php ,如果不是,请自行修改第一行为实际的PHP引擎路径,比如:#! /usr/local/php/bin/php 使用上面的脚本来下载文件:download.php   远程文件  保存路径如把Google Talk程序下载到我们的 /tmp 目录下:download.php  http://dl.google.com/googletalk/googletalk-setup.exe     /tmp/

    如果不出错,等待一会就能够在 /tmp/ 目录下看到 googletalk-setup.exe 文件。

    能够改进的就是支持更多协议、需要验证的能够输入用户名密码、有下载进度条。至于断点续传和多线程对于PHP来说还不太现实,有兴趣的可以自己加深一步。

    PS: 我另外发现一个更强的HTTP下载类,是dedeCMS的作者IT柏拉图写的,URL:http://prato.bokele.com/?CH=749&ViewID=15272 


    最新回复(0)