Так как раздел для начинающих, напишу проверенный пример загрузки файла на сервер. Я как начинающий HTML код писать ручками не умею. Страничку сгенерил WYSIWYG Web Builder 16, а потом начал навешивать на нее все необходимое. Привожу куски рабочего кода с реального проекта. Может кому начинающему и пригодятся
JavaScript:
<script>
$(document).ready(function()
{
$("#FiSe :file").on('change', function()
{
var input = $(this).parents('.input-group').find(':text');
input.val($(this).val());
});
$("#upload").button();
$("#proBar").progressbar(
{
value: 0,
change: function()
{
$("#proBar-label").text($(this).progressbar('value') + '%');
}
});
});
</script>
</head>
<body>
<div id="FiSe" class="input-group" style="position:absolute;left:494px;top:370px;width:305px;height:53px;z-index:14;">
<input class="form-control" type="text" readonly="">
<label class="input-group-btn">
<input type="file" name="FiSe" id="FiSe-file" style="display:none;"><span class="btn">Выбрать файл</span>
</label>
</div>
<button type="submit" id="upload" name="upload" value="Записать" style="position:absolute;left:685px;top:241px;width:99px;height:46px;z-index:28;" title="Записать на SD">Записать</button>
<div id="proBar" style="position:absolute;left:498px;top:376px;width:294px;height:39px;z-index:15;">
<div id="proBar-label">14%</div>
</div>
Возможно тут есть лишний код, ведь его создал генератор
FiSe - кнопка выбора файла
upload - кнопка отправки файла на сервер
proBar - progressbar - показывает прогресс процедуры загрузки
JavaScript:
proBar.hidden=true;
var time = performance.now();
upload.onclick = function(e) {
let fileLen=document.getElementById("FiSe-file").files.length
if(fileLen === 0){
return;
}
proBar.hidden=false;
$('#proBar').progressbar('option', 'value', 0);
var fileUp = document.getElementById("FiSe-file").files[0];
let formData = new FormData();
formData.append("photo",fileUp );
xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", "/edit");
//*******************************************************
xmlHttp.upload.onprogress = function(event){
let UpV =Math.round((event.loaded *100) /event.total);
$('#proBar').progressbar('option', 'value', UpV);
}
xmlHttp.onload = xmlHttp.onerror = function() {
time = Math.round(performance.now() - time);
var d = new Date(time);
proBar.hidden=true;
if (this.status == 200) { alert("Все хорошо!\n"+ "Файл размером "+
fileUp.size/1000+" Kb\n"+"Записали на SD за "+ d.getUTCMinutes() +
" минут " + d.getUTCSeconds() + " секунд "); }
else { alert("Все плохо!"); }
};
//**************************************
xmlHttp.send(formData);
}
Вообще в HTTP запросах есть маленький камушек преткновения. Для начинающих сделаю открытие. Как начинающий я всегда помнил что исполнение программы- последовательное выполнение строк. В запросе не так. С начала исполняется последовательно строки до xmlHttp.send(formData);. Потом xmlHttp.send(formData);. И после этого функция - xmlHttp.upload.onprogress = function(event). Вы скажите это очевидно, но когда (два месяца назад) я начал изучать Javascript, этой очевидности я не нашел