iT邦幫忙

0

【如何利用 php 下載遠端的檔案??】

$urls = array(
'http://localhost:8080/xls/sme.xls',
'http://localhost:8080/member/256438.jpg',
);
 
$save_to='./temp/';
 
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
    $g = $save_to.basename($url);
    if(!is_file($g)){
        $conn[$i] = curl_init($url);
        $fp[$i] = fopen ($g, "w");
        curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
        curl_setopt($conn[$i], CURLOPT_FILE, $fp[$i]);
        curl_setopt($conn[$i], CURLOPT_HEADER ,0);
        curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
        curl_multi_add_handle ($mh,$conn[$i]);
    }
}
do {
    $n = curl_multi_exec($mh,$active);
}
while ($active);
foreach ($urls as $i => $url) {
    curl_multi_remove_handle($mh,$conn[$i]);
    curl_close($conn[$i]);
    fclose($fp[$i]);
}
curl_multi_close($mh);

它的確會把檔案下到我的目錄中
但我有兩個問題

1.當我執行第一次時,畫面會一片空白,然後兩個檔案就出現在我的目錄中了(sme.xls,sme.xls)
但我再執行一次時,會出現

Warning: curl_multi_remove_handle() expects parameter 2 to be resource, null given in C:\wamp\www\download.php on line 51

Warning: curl_close(): supplied argument is not a valid cURL handle resource in C:\wamp\www\download.php on line 52

Warning: fclose(): supplied argument is not a valid stream resource in C:\wamp\www\download.php on line 53

Warning: curl_multi_remove_handle() expects parameter 2 to be resource, null given in C:\wamp\www\download.php on line 51

Warning: curl_close(): supplied argument is not a valid cURL handle resource in C:\wamp\www\download.php on line 52

Warning: fclose(): supplied argument is not a valid stream resource in C:\wamp\www\download.php on line 53

就程式碼而言

curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
fclose($fp[$i]);

這三行

2.因為我檔案是每天都要下載的,我想上面的第一點是因為目錄已經有相同的檔案,所以才會出現那些警告訊息,如果我希望下載下來的檔案
自動加上
年-月-日 時:分:秒
請問要怎麼弄呢
我有自己試著加到
$g = $save_to.basename($url);中
但是失敗了

以上兩點,請有經驗幫忙
感謝

1 個回答

4
wiseguy
iT邦超人 1 級 ‧ 2012-02-27 22:49:46
最佳解答

雖然我不知道你為什麼要這樣抓檔案,而且把抓檔案動作分成三個迴圈 (一個迴圈就做完不好嗎?),不過既然你知道會有 warning 就是檔案已存在,那麼解決第二個問題就等於解了第一個問題了:

$g = $save_to . date('Y-m-d_H-i-s_') . basename($url);

我要發表回答

立即登入回答