溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php怎么實現(xiàn)下載進度條

發(fā)布時間:2021-10-28 11:03:24 來源:億速云 閱讀:300 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“php怎么實現(xiàn)下載進度條”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“php怎么實現(xiàn)下載進度條”吧!

php實現(xiàn)下載進度條的方法:1、創(chuàng)建“download.php”文件,代碼如“switch ($action) {case 'prepare-download'...}”;2、通過創(chuàng)建js代碼顯示進度條即可。

php怎么實現(xiàn)下載進度條

本文操作環(huán)境:Windows7系統(tǒng)、PHP7.1版、DELL G3電腦

php如何實現(xiàn)下載進度條?

PHP 遠程文件下載的進度條實現(xiàn)

download.php

<?php
// 當(dāng)前文件:download.php

$action = @$_GET['action'];

// 自己獲取這些信息
$remote_url  = get_remote_file_url();
$file_size   = get_remote_file_size($remote_url);
$tmp_path    = get_tmp_path();

switch ($action) {
    case 'prepare-download':
        // 下載緩存文件夾
        $download_cache = __DIR__."/download_cache";

        if (!is_dir($download_cache)) {
            if (false === mkdir($download_cache)) {
                exit('創(chuàng)建下載緩存文件夾失敗,請檢查目錄權(quán)限。');
            }
        }

        $tmp_path = $download_cache."/update_".time().".zip";

        save_tmp_path(); // 這里保存臨時文件地址

        return json(compact('remote_url', 'tmp_path', 'file_size'));

        break;

    case 'start-download':

        // 這里檢測下 tmp_path 是否存在

        try {
            set_time_limit(0);

            touch($tmp_path);

            // 做些日志處理

            if ($fp = fopen($remote_url, "rb")) {

                if (!$download_fp = fopen($tmp_path, "wb")) {
                    exit;
                }

                while (!feof($fp)) {

                    if (!file_exists($tmp_path)) {
                        // 如果臨時文件被刪除就取消下載
                        fclose($download_fp);

                        exit;
                    }

                    fwrite($download_fp, fread($fp, 1024 * 8 ), 1024 * 8);
                }

                fclose($download_fp);
                fclose($fp);

            } else {
                exit;
            }

        } catch (Exception $e) {
            Storage::remove($tmp_path);

            exit('發(fā)生錯誤:'.$e->getMessage());
        }

        return json(compact('tmp_path'));

        break;

    case 'get-file-size':

        // 這里檢測下 tmp_path 是否存在

        if (file_exists($tmp_path)) {
            // 返回 JSON 格式的響應(yīng)
            return json(['size' => filesize($tmp_path)]);
        }

        break;

    default:
        # code...
        break;
}

js

// 咋觸發(fā)這個函數(shù)我就不舉例了
function downloadFile() {
    var file_size = 0;
    var progress  = 0;

    console.log("Prepared to download");

    $.ajax({
        url: './download.php?action=prepare-download',
        type: 'GET',
        dataType: 'json',
        beforeSend: function() {
            $('#update-button').html('<i class="fa fa-spinner fa-spin"></i> 正在準(zhǔn)備').prop('disabled', 'disabled');
        },
    })
    .done(function(json) {
        console.log(json);

        file_size = json.file_size;

        $('#file-size').html(file_size);

        // 顯示進度條

        console.log("started downloading");
        $.ajax({
            url: './download.php?action=start-download',
            type: 'POST',
            dataType: 'json'
        })
        .done(function(json) {
            // set progress to 100 when got the response
            progress = 100;

            console.log("Downloading finished");
            console.log(json);
        })
        .fail(showAjaxError);

        var interval_id = window.setInterval(function() {

            $('#imported-progress').html(progress);
            $('.progress-bar').css('width', progress+'%').attr('aria-valuenow', progress);

            if (progress == 100) {
                clearInterval(interval_id);

                // 到此遠程文件下載完成,繼續(xù)其他邏輯
            } else {
                $.ajax({
                    url: './download.php?action=get-file-size',
                    type: 'GET'
                })
                .done(function(json) {
                    progress = (json.size / file_size * 100).toFixed(2);

                    updateProgress(progress);

                    console.log("Progress: "+progress);
                })
                .fail(showAjaxError);
            }

        }, 300);

    })
    .fail(showAjaxError);

}

到此,相信大家對“php怎么實現(xiàn)下載進度條”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI