首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 遠程下載文件到本地:cURL 與 Stream 兩種實現

     編輯:PHP 相關知識

通用下載函數 httpcopy()

支援 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 調用,第二種適合簡單頁面下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved