PHP Ajax Upload Progress Bar

后端 未结 6 1233
自闭症患者
自闭症患者 2020-11-30 22:56
相关标签:
6条回答
  • 2020-11-30 23:42

    Introduction

    The PHP Doc is very detailed it says

    The upload progress will be available in the $_SESSION superglobal when an upload is in progress, and when POSTing a variable of the same name as the session.upload_progress.name INI setting is set to. When PHP detects such POST requests, it will populate an array in the $_SESSION, where the index is a concatenated value of the session.upload_progress.prefix and session.upload_progress.name INI options. The key is typically retrieved by reading these INI settings, i.e.

    All the information you require is all ready in the PHP session naming

    • start_time
    • content_length
    • bytes_processed
    • File Information ( Supports Multiple )

    All you need is to extract this information and display it in your HTML form.

    Basic Example

    a.html

    <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css"
    rel="stylesheet" type="text/css" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    <script type="text/javascript">
        var intval = null;
        var percentage = 0 ;
        function startMonitor() {
            $.getJSON('b.php',
            function (data) {
                if (data) {
                    percentage = Math.round((data.bytes_processed / data.content_length) * 100);
                    $("#progressbar").progressbar({value: percentage});
                    $('#progress-txt').html('Uploading ' + percentage + '%');
    
                }
                if(!data || percentage == 100){
                    $('#progress-txt').html('Complete');
                    stopInterval();
                }
            });
        }
    
        function startInterval() {
            if (intval == null) {
                intval = window.setInterval(function () {startMonitor()}, 200)
            } else {
                stopInterval()
            }
        }
    
        function stopInterval() {
            if (intval != null) {
                window.clearInterval(intval)
                intval = null;
                $("#progressbar").hide();
                $('#progress-txt').html('Complete');
            }
        }
    
        startInterval();
    </script>
    

    b.php

    session_start();
    header('Content-type: application/json');
    echo json_encode($_SESSION["upload_progress_upload"]);
    

    Example with PHP Session Upload Progress

    Here is a better optimized version from PHP Session Upload Progress

    JavaScript

    $('#fileupload').bind('fileuploadsend', function (e, data) {
        // This feature is only useful for browsers which rely on the iframe transport:
        if (data.dataType.substr(0, 6) === 'iframe') {
            // Set PHP's session.upload_progress.name value:
            var progressObj = {
                name: 'PHP_SESSION_UPLOAD_PROGRESS',
                value: (new Date()).getTime()  // pseudo unique ID
            };
            data.formData.push(progressObj);
            // Start the progress polling:
            data.context.data('interval', setInterval(function () {
                $.get('progress.php', $.param([progressObj]), function (result) {
                    // Trigger a fileupload progress event,
                    // using the result as progress data:
                    e = document.createEvent('Event');
                    e.initEvent('progress', false, true);
                    $.extend(e, result);
                    $('#fileupload').data('fileupload')._onProgress(e, data);
                }, 'json');
            }, 1000)); // poll every second
        }
    }).bind('fileuploadalways', function (e, data) {
        clearInterval(data.context.data('interval'));
    });
    

    progress.php

    $s = $_SESSION['upload_progress_'.intval($_GET['PHP_SESSION_UPLOAD_PROGRESS'])];
    $progress = array(
            'lengthComputable' => true,
            'loaded' => $s['bytes_processed'],
            'total' => $s['content_length']
    );
    echo json_encode($progress);
    

    Other Examples

    • Tracking Upload Progress with PHP and JavaScript
    • PHP-5.4-Upload-Progress-Example
    0 讨论(0)
  • 2020-11-30 23:44

    May I suggest you FileDrop.

    I used it to make a progess bar, and it's pretty easy.

    The only downside I met, is some problems working with large amounts of data, because it dosen't seem to clear up old files -- can be fixed manually.

    Not written as JQuery, but it's pretty nice anyway, and the author answers questions pretty fast.

    0 讨论(0)
  • 2020-11-30 23:44

    XMLHTTPREQUSET2

    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'video.avi', true);
    xhr.responseType = 'blob';
    
    xhr.onload = function(e) {
      if (this.status == 200) {
        var blob = this.response;
    /*
        var img = document.createElement('img');
        img.onload = function(e) {
          window.URL.revokeObjectURL(img.src); // Clean up after yourself.
        };
        img.src = window.URL.createObjectURL(blob);
        document.body.appendChild(img);
        /*...*/
      }
    };
    xhr.addEventListener("progress", updateProgress, false);
    xhr.send();
    
    
    
    function updateProgress (oEvent) {
      if (oEvent.lengthComputable) {
        var percentComplete = oEvent.loaded / oEvent.total;
        console.log(percentComplete)
      } else {
        // Unable to compute progress information since the total size is unknown
      }
    }
    
    0 讨论(0)
  • 2020-11-30 23:45

    While it may be good fun to write the code for a progress bar, why not choose an existing implementation. Andrew Valums wrote an excellent one and you can find it here:

    http://fineuploader.com/

    I use it in all my projects and it works like a charm.

    0 讨论(0)
  • 2020-11-30 23:47

    This is my code its working fine Try it :

    Demo URL

    http://codesolution.in/dev/jQuery/file_upload_with_progressbar/

    Try this below code:-

    this is my html code

    <!doctype html>
    <head>
    <title>File Upload Progress Demo #1</title>
    <style>
    body { padding: 30px }
    form { display: block; margin: 20px auto; background: #eee; border-radius: 10px; padding: 15px }
    
    .progress { position:relative; width:400px; border: 1px solid #ffffd; padding: 1px; border-radius: 3px; }
    .bar { background-color: #B4F5B4; width:0%; height:20px; border-radius: 3px; }
    .percent { position:absolute; display:inline-block; top:3px; left:48%; }
    </style>
    </head>
    <body>
        <h1>File Upload Progress Demo #1</h1>
        <code>&lt;input type="file" name="myfile"></code>
            <form action="upload.php" method="post" enctype="multipart/form-data">
            <input type="file" name="uploadedfile"><br>
            <input type="submit" value="Upload File to Server">
        </form>
    
        <div class="progress">
            <div class="bar"></div >
            <div class="percent">0%</div >
        </div>
    
        <div id="status"></div>
    
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
    <script src="http://malsup.github.com/jquery.form.js"></script>
    <script>
    (function() {
    
    var bar = $('.bar');
    var percent = $('.percent');
    var status = $('#status');
    
    $('form').ajaxForm({
        beforeSend: function() {
            status.empty();
            var percentVal = '0%';
            bar.width(percentVal)
            percent.html(percentVal);
        },
        uploadProgress: function(event, position, total, percentComplete) {
            var percentVal = percentComplete + '%';
            bar.width(percentVal)
            percent.html(percentVal);
        },
        complete: function(xhr) {
         bar.width("100%");
        percent.html("100%");
            status.html(xhr.responseText);
        }
    }); 
    
    })();       
    </script>
    
    </body>
    </html>
    

    My upload.php file code

    <?php
    $target_path = "uploads/";
    
    $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 
    
    if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
        echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
        " has been uploaded";
    } else{
        echo "There was an error uploading the file, please try again!";
    }
    ?>
    
    0 讨论(0)
  • 2020-11-30 23:56

    First of all, make sure you have PHP 5.4 installed on your machine. You didn't tag php-5.4 so I don't know. Check by calling echo phpversion(); (or php -v from the command line).

    Anyway, assuming you have the correct version, you must be able to set the correct values in the php.ini file. Since you say you can't do that, it's not worth me launching into an explanation on how to do it.

    As a fallback solution, use a Flash object uploader.

    0 讨论(0)
提交回复
热议问题