支援 cURL 優先,不可用時降級至 stream_context_create()。自動建立目錄、處理 URL 空格、返回文件名、方式、大小、耗時。
<?php
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);
$result = ['fileName' => '', 'way' => '', 'size' => 0, 'spendTime' => 0];
$start = microtime(true);
if (function_exists('curl_init')) {
$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)) {
$result['fileName'] = $file;
$result['way'] = 'curl';
$result['size'] = sprintf('%.3f', strlen($temp) / 1024);
}
} else {
$opts = ['http' => ['method' => 'GET', 'header' => '', 'timeout' => $timeout]];
$context = stream_context_create($opts);
if (@copy($url, $file, $context)) {
$result['fileName'] = $file;
$result['way'] = 'copy';
$result['size'] = sprintf('%.3f', strlen(file_get_contents($file)) / 1024);
}
}
$result['spendTime'] = round((microtime(true) - $start) * 1000); // ms
return $result;
}
?>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" value="下載" />
</form>
<?php
set_time_limit(24 * 60 * 60);
if (isset($_POST['submit'])) {
$destination_folder = 'temp/';
$url = $_POST['url'];
$newfname = $destination_folder . basename($url);
$file = fopen($url, "rb");
if ($file) {
$newf = fopen($newfname, "wb");
if ($newf) while (!feof($file)) fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
fclose($file); fclose($newf);
}
}
?>
第一種封裝函數適合 API 調用,第二種適合簡單頁面下載。