Код: Выделить всё
//функция подготовки файла для отправки. Разбивающая и контролирующая корректность доставки
function uploadFile(file, start, nRepeat) {
var inputButton = document.getElementById('p_uploaddata');
if(stopUpload) {
stopUpload=false;
setTimeoutGetDashData(1);
alert('отправка отменена');
inputButton.innerHTML=file.name+" + отправка остановлена";
return;
}
window.BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder;
const BYTES_PER_CHUNK = 3000; // размер блока посылаемого на сервер
const SIZE = file.size;
var
request = new XMLHttpRequest();
request.timeout = 10000; // Максимальная продолжительность асинхронного запроса 10 секунд
request.ontimeout = function() { alert( 'отсутствует ответ от сервера' ); } //действие по таймауту
var end = start+BYTES_PER_CHUNK;
var writtenByte=0; //количество записанных байт - ответ сервера
var maxRepeat = 10; //максимальное количество повторов
var url="";
var progressBar = document.querySelector('progress');
progressBar.value = (start/SIZE)*100;
progressBar.textContent = (start/SIZE)*100;
progressBar.title = (start/SIZE)*100;
inputButton.innerHTML = file.name+" "+start+"/"+SIZE;
if(start==SIZE){
alert ('Загрузка выполнена успешно');
setTimeoutGetDashData(1);
inputButton.innerHTML=file.name+" успешно отправлен";
return;
}
setTimeoutGetDashData(0);//делаем реже запрос на получение информации для даш-панели
//с первым блоком данных посылаем команду на создание файла
if(start==0) url="/"+file.name.toLowerCase()+"&createfile&uploadfile";
else url="/"+file.name.toLowerCase()+"&uploadfile";
var chunk = file.slice(start, end);
request.onreadystatechange = function() {
if (this.readyState != 4) return;
if ((this.status == 200)&&(isFinite(this.responseText))){
if(this.responseText>0)
uploadFile(file, start+parseInt(this.responseText), 0);
}
else{
//alert('Запрос вернулся с ошибкой: '+this.status+'\n текст:'+this.statusText+'\n responseText:'+this.responseText);
if(nRepeat<maxRepeat)
uploadFile(file, start, nRepeat++);
else {
alert('Отправка файла прервана из-за большого количества неудачных попыток');
setTimeoutGetDashData(1);
inputButton.innerHTML=file.name+" + отправка остановлена по причине отсутствия сервера";
}
}
};
request.open('POST', url + randomNoCache(), true);
request.send(chunk); // multipart/form-data
}
Код: Выделить всё
<div class="box">
<div class="input_button_style">
<div class="input_font_style">Отправить файл на сервер</div>
<input type="file" name="select_file" onchange="getFiles(this.files[0])" id="inputFilename" size="1" class="input_input_style">
</div>
<p id="p_uploaddata"></p>
<p><progress min="0" max="100" value="0"><span>0</span>%</progress></p>
<p><button onclick="stopUpload=true">Отменить</button></p>
</div>