Показать сообщение отдельно
  #1 (permalink)  
Старый 06.11.2014, 04:05
Профессор
Отправить личное сообщение для cript Посмотреть профиль Найти все сообщения от cript
 
Регистрация: 03.02.2014
Сообщений: 238

Мультизагрузка файлов по частям
Приветствую!
Есть форма, через которую проходит загрузка файлов через FileReader. При загрузке одного файла все срабатывает, но если выбрать несколько файлов то все идет не так, загружается последний файл, а те, что идут за ним не догружаются, посмотрите, что не так с этим кодом
if(!XMLHttpRequest.prototype.sendAsBinary) { 
XMLHttpRequest.prototype.sendAsBinary = function(datastr){ function byteValue(x) { return x.charCodeAt(0) & 0xff; } var ords = Array.prototype.map.call(datastr, byteValue); var ui8a = new Uint8Array(ords); this.send(ui8a.buffer); } }
function FileUploader(options) { 
this.filesize = 0; 
this.file = null; 
this.options = options;
this.position = 0;  
this.CheckBrowser = function(){ 
if(window.File && window.FileReader && window.FileList && window.Blob) { return true; } else { return false; } } 
this.UploadPortion = function(id,from,filename,filesize){ 
var reader = new FileReader(); var that = this; var loadfrom = from; var blob = null; 
var xhrHttpTimeout = null; 
reader.onloadend = function(evt){ 
if(evt.target.readyState == FileReader.DONE) { 
var xhr = new XMLHttpRequest(); 
xhr.open('POST', './upload', true); xhr.setRequestHeader("Content-Type", "application/x-binary; charset=x-user-defined"); 
xhr.setRequestHeader("Upload-Id", id); 
xhr.setRequestHeader("Portion-From", from); 
xhr.setRequestHeader("File-Name", filename);
xhr.setRequestHeader("File-Size", filesize); 
xhr.setRequestHeader("Portion-Size", that.options['portion']); 
that.xhrHttpTimeout = setTimeout(function(){ xhr.abort(); },that.options['timeout']); 
xhr.addEventListener("load", function(evt){ 
clearTimeout(that.xhrHttpTimeout);
 if(evt.target.status!=200) { alert(evt.target.responseText); return; }
that.position+=that.options['portion']; 
if(filesize > that.position) { that.UploadPortion(id,that.position,filename,filesize); 
} else {
alert('done');
} }, false);
xhr.sendAsBinary(evt.target.result); } }; 
that.blob = null; 
if(this.file.slice) { 
that.blob = this.file.slice(from,from+that.options['portion']); 
} else { 
if(this.file.webkitSlice) { that.blob = this.file.webkitSlice(from,from+that.options['portion']); 
} else {
if(this.file.mozSlice) { that.blob = this.file.mozSlice(from,from+that.options['portion']); } 
} } 
reader.readAsBinaryString(that.blob); 
} 
this.Upload = function(id,filename,filesize){ 
if(!this.file) { return -1; } else { 
this.UploadPortion(id,0,filename,filesize); 
} } 
if(this.CheckBrowser()) { 
this.options['portion'] = 1048576; 
this.options['timeout'] = 150000;
var that = this; 
document.getElementById('files').addEventListener('change', function(evt){ 
var files = evt.target.files; 
for(var i=0; i < files.length; i++) { 
var f = files[i]; that.filename = f.name; that.filesize = f.size; that.file = f; 
var rid = RandomCode(32); //новый id загрузки
if(i==0) { var cur_id = that.options['uploadid']; } else { var cur_id = rid; } 
that.Upload(cur_id,that.filename,that.filesize); 
}
(arguments[0].preventDefault)? arguments[0].preventDefault(): arguments[0].returnValue = false; 
}, false);
} }

<input type="file" id="files" name="files[]" multiple>
<script type="text/javascript">
function Form() {var uploader = new FileUploader({ uploadid: '<?=$id?>'});
if(!uploader.CheckBrowser()) 
{
alert(error);
}
}
window.onload = Form();
</script>
Ответить с цитированием