<?php
set_time_limit(0);
if(isset($_GET['url']) && isset($_GET['filename'])){
if(httpcopy($_GET['url'], $_GET['filename'])){
echo("Done.");
}else{
echo("Down Error.");
}
}else{
die('Input error.');
}
function httpcopy($url, $file="", $timeout=60) {
$file = empty($file) ? pathinfo($url,PATHINFO_BASENAME) : $file;
$dir = pathinfo($file,PATHINFO_DIRNAME);
!is_dir($dir) && @mkdir($dir,0755,true);
$url = str_replace(" ","%20",$url);
if(function_exists('curl_init')) {
echo "curl ";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$temp = curl_exec($ch);
if(@file_put_contents($file, $temp) && !curl_error($ch)) {
return $file;
} else {
return false;
}
} else {
echo "copy ";
$opts = array(
"http"=>array(
"method"=>"GET",
"header"=>"",
"timeout"=>$timeout)
);
$context = stream_context_create($opts);
if(@copy($url, $file, $context)) {
//$http_response_header
return $file;
} else {
return false;
}
}
}
?>
這段代碼是PHP語言編寫的,它的作用是從一個指定的URL下載文件,并將其保存到服務(wù)器上。下面是代碼的逐行解釋:
set_time_limit(0);
– 設(shè)置腳本的執(zhí)行時間無限制,這樣腳本可以運行任意長的時間。if(isset($_GET['url']) && isset($_GET['filename'])){
– 檢查是否有GET請求的參數(shù)url
和filename
。if(httpcopy($_GET['url'], $_GET['filename'])){
– 如果httpcopy
函數(shù)成功執(zhí)行,即文件下載成功。echo("Done.");
– 輸出“Done.”表示文件下載并保存成功。}else{
– 如果httpcopy
函數(shù)執(zhí)行失敗。echo("Down Error.");
– 輸出“Down Error.”表示下載過程中出現(xiàn)了錯誤。}else{
– 如果沒有GET請求的參數(shù)url
或filename
。die('Input error.');
– 終止腳本執(zhí)行并輸出“Input error.”表示輸入錯誤。function httpcopy($url, $file="", $timeout=60) {
– 定義了一個名為httpcopy
的函數(shù),它接受三個參數(shù):文件的URL、文件名(可選,默認為空),以及超時時間(默認60秒)。$file = empty($file) ? pathinfo($url,PATHINFO_BASENAME) : $file;
– 如果沒有提供文件名,就使用URL的最后一部分作為文件名。$dir = pathinfo($file,PATHINFO_DIRNAME);
– 獲取文件名的目錄路徑。!is_dir($dir) && @mkdir($dir,0755,true);
– 如果目錄不存在,則創(chuàng)建目錄,權(quán)限設(shè)置為755。$url = str_replace(" ","%20",$url);
– 將URL中的空格替換為%20
,因為URL中不能直接包含空格。if(function_exists('curl_init')) {
– 檢查服務(wù)器是否支持cURL。echo "curl ";
– 如果支持cURL,輸出“curl”。- 使用cURL進行文件下載,如果成功則保存到指定的文件路徑。
else {
– 如果服務(wù)器不支持cURL。echo "copy ";
– 輸出“copy”。- 使用PHP的
stream_context_create
和copy
函數(shù)進行文件下載,如果成功則保存到指定的文件路徑。 }
– 函數(shù)定義結(jié)束。
這段代碼存在安全風(fēng)險,因為它允許通過URL參數(shù)直接下載文件到服務(wù)器,這可能會導(dǎo)致惡意文件被下載和執(zhí)行。在實際應(yīng)用中,這樣的腳本應(yīng)該進行嚴格的安全檢查和限制。