18.04.2024

SOCSEO.RU

Интересная информация и полезные статьи…

Прогресс бар для INPUT загрузка видео CSS, PHP, Javascript.

Среднее прочтение 1 мин.

Использование PHP для загрузки файла через HTML-форму является обычным явлением, на самом деле это совершенно нормально, однако ожидать или пытаться получить индикатор выполнения для отслеживания загрузки — это дурацкая концепция. Это не то, как работает PHP, и выполнение живых изменений на странице лучше оставить для JavaScript.

Но вполне возможно получить индикатор выполнения для загрузки файла PHP. У меня есть хороший рабочий пример, собранный воедино.

Форма выполнена в стиле Bootstrap и некоторых других пользовательских стилей CSS.

Вот index.html он содержит HTML-форму для загрузки видео (.mp4)

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Upload Mp4</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link rel="stylesheet" type="text/css" href="bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="upload.js"></script>
</head>
<body>
<div class="container">
    <div class="row text-center">
        <div class="col-2"></div>
        <div class="col-8">
            <form id="upload_form" enctype="multipart/form-data" method="post">
                <div class="form-group">
                    <input type="file" name="uploadingfile" id="uploadingfile">
                </div>
                <div class="form-group">
                    <input class="btn btn-primary" type="button" value="Upload File" name="btnSubmit"
                           onclick="uploadFileHandler()">
                </div>
                <div class="form-group">
                    <div class="progress" id="progressDiv">
                        <progress id="progressBar" value="0" max="100" style="width:100%; height: 1.2rem;"></progress>
                    </div>
                </div>
                <div class="form-group">
                    <h3 id="status"></h3>
                    <p id="uploaded_progress"></p>
                </div>
            </form>
        </div>
        <div class="col-2"></div>
    </div>
</div>
</body>
</html>

upload.js содержит Ajax JavaScript, который обрабатывает прогресс «в реальном времени»

function _(abc) {
    return document.getElementById(abc);
}

function uploadFileHandler() {
    var file = _("uploadingfile").files[0];
    var formdata = new FormData();
    formdata.append("uploadingfile", file);
    var ajax = new XMLHttpRequest();
    ajax.upload.addEventListener("progress", progressHandler, false);
    ajax.addEventListener("load", completeHandler, false);
    ajax.addEventListener("error", errorHandler, false);
    ajax.addEventListener("abort", abortHandler, false);
    ajax.open("POST", "upload.php");
    ajax.send(formdata);
}

function progressHandler(event) {
    var loaded = new Number((event.loaded / 1048576));//Make loaded a "number" and divide bytes to get Megabytes
    var total = new Number((event.total / 1048576));//Make total file size a "number" and divide bytes to get Megabytes
    _("uploaded_progress").innerHTML = "Uploaded " + loaded.toPrecision(5) + " Megabytes of " + total.toPrecision(5);//String output
    var percent = (event.loaded / event.total) * 100;//Get percentage of upload progress
    _("progressBar").value = Math.round(percent);//Round value to solid
    _("status").innerHTML = Math.round(percent) + "% uploaded";//String output
}

function completeHandler(event) {
    _("status").innerHTML = event.target.responseText;//Build and show response text
    _("progressBar").value = 0;//Set progress bar to 0
    document.getElementById('progressDiv').style.display = 'none';//Hide progress bar
}

function errorHandler(event) {
    _("status").innerHTML = "Upload Failed";//Switch status to upload failed
}

function abortHandler(event) {
    _("status").innerHTML = "Upload Aborted";//Switch status to aborted
}

Вот upload.php что делает обработка загрузки файла PHP

<?php
if (!$_FILES["uploadingfile"]["tmp_name"]) {//No file chosen
    echo "ERROR: Please browse for a file before clicking the upload button.";
    exit();
} else {
    $extension = pathinfo($_FILES['uploadingfile']['name'], PATHINFO_EXTENSION);//Gets the file extension
    if ((($_FILES["uploadingfile"]["type"] == "video/mp4")) && $extension == 'mp4') {//Check if MP4 extension
        $folderPath = "uploads/";//Directory to put file into
        $original_file_name = $_FILES["uploadingfile"]["name"];//File name
        $size_raw = $_FILES["uploadingfile"]["size"];//File size in bytes
        $size_as_mb = number_format(($size_raw / 1048576), 2);//Convert bytes to Megabytes
        if (move_uploaded_file($_FILES["uploadingfile"]["tmp_name"], "$folderPath" . $_FILES["uploadingfile"]["name"] . "")) {//Move file
            echo "$original_file_name upload is complete";
            //echo "$original_file_name uploaded to $folderPath it is $size_as_mb Mb.";
        }
    } else {
        echo "File is not a MP4";
        exit;
    }
}

Убедитесь, что у вас есть папка для загрузки , вот style.css если вам нужен мой стиль формы;

body, html {
    background-color: #0b1025;
    color: #e8e8e8;
}

form {
    margin-top: 50%;
    background: #191922;
    border-radius: .3rem;
    padding: 1.3rem;
    border: #2274ac40 1px solid;
}

input {
    width: 100%;
    background: #3c4760;
    border: 0;
    padding: 20px;
    border-radius: 6px;
    margin-bottom: 10px;
    border: 1px solid #839af5;
}

.btn {
    width: 100%;
    padding: .5rem;
    border: 0;
    background: #2b2a60;
    font-size: 1.2em;
    color: #fff;
    text-shadow: 1px 1px 0px rgba(0, 0, 0, .4);
    box-shadow: 0px 3px 0px #3a41a2;
    margin-top: 1.2rem;
}

.btn:hover {
    background: #1e1e3c;
    color: #b5b5b5;
    box-shadow: none;
}

.form-control {
    display: block;
    width: 100%;
    height: calc(1.5em + .75rem + 2px);
    padding: .375rem .75rem;
    font-size: 1rem;
    font-weight: 400;
    line-height: 1.5;
    color: #d6d8db;
    background-color: #3c4760;
    background-clip: padding-box;
    border: 1px solid #72a7db;
    border-radius: .25rem;
    transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
}

.progress {
    background-color: #3fee8c;
    position: relative;
    margin: 20px;
    height: 1.2rem;
}

.progress-bar {
    background-color: #7eeed8;
    width: 100%;
    height: 1.2rem;
}

progress::-webkit-progress-value {
    background: #3fee8c;
}

progress::-webkit-progress-bar {
    background: #1e1e3c;
}

progress::-moz-progress-bar {
    background: #3fee8c;
}

ИСТОЧНИК