使用PHP腳本下載遠程文件

<?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
<?php
error_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
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章