Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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>
Ответить с цитированием
  #2 (permalink)  
Старый 06.11.2014, 06:30
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Код все равно не ваш. Скачайте pluploader и не мучайтесь.
Ответить с цитированием
  #3 (permalink)  
Старый 06.11.2014, 15:21
Профессор
Отправить личное сообщение для cript Посмотреть профиль Найти все сообщения от cript
 
Регистрация: 03.02.2014
Сообщений: 238

Сообщение от kostyanet Посмотреть сообщение
Код все равно не ваш. Скачайте pluploader и не мучайтесь.
Посмотрел я "pluploader" - работает на jquery + загружает файлы по очереди, а в моем примере загружаются все выбранные файлы
Ответить с цитированием
  #4 (permalink)  
Старый 06.11.2014, 15:29
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Тогда еще проще - отгружайте форму целиком и не мучайтесь. Все файлы гурьбой и уйдут.
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2014, 16:00
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Вспомнил, есть такой скриптик - ноу JQ, все остальное имеется. https://github.com/bgrins/filereader.js
Ответить с цитированием
  #6 (permalink)  
Старый 06.11.2014, 20:04
Профессор
Отправить личное сообщение для cript Посмотреть профиль Найти все сообщения от cript
 
Регистрация: 03.02.2014
Сообщений: 238

Это все не то.
Может кто нибудь знает как по данному коду реализовать хотя бы поочередную загрузку? То есть выбрали несколько файлов, пошла загрузка первого, но где хранить данные о последующих файлах для их дальнейшей загрузки?
Ответить с цитированием
  #7 (permalink)  
Старый 06.11.2014, 22:10
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Это прикол такой? Вам же не надо по-очереди, вам же надо по-очереди... надо выбрать в какой очереди стоять сперва.

Из формы все файлы уходят как хотят, вы не можете этого контролировать. Кстати это легко увидеть если приделать прогресс к форме. Бар колбасит нипадецки.

У вас гавнокод, его чинить только за деньги. Чувак с гитхаба написал отличную вещь, там даже фоновая загрузка есть через Worker'а, синхронная то есть. PlUploader вообще все юзают кому одни только файлы закачивать надо.
Ответить с цитированием
  #8 (permalink)  
Старый 06.11.2014, 23:58
Профессор
Отправить личное сообщение для cript Посмотреть профиль Найти все сообщения от cript
 
Регистрация: 03.02.2014
Сообщений: 238

В общем по моему лучший вариант из всего предложенного это resumable (resumablejs.com), поддерживается докачка, параллельная загрузка и еще много чего..
Ответить с цитированием
  #9 (permalink)  
Старый 07.11.2014, 06:16
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Это когда были модемы была докачка и водокачка. "Параллельность" сам IP обеспечивает, из-за чего прогресс и колбасит.

Ну то есть какая вообще докачка через браузер? Ну то есть можно, но такое нормально делается в приложениях.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nodejs, busboy, загрузка нескольких файлов, не корректно вызывается событие 'finish' master_alf AJAX и COMET 1 07.10.2014 11:08
Отсылка нескольких файлов одним post koeshiro AJAX и COMET 1 19.09.2014 15:08
ajax-форма с загрузкой файлов и обычными полями iNfantry jQuery 1 12.04.2014 16:30
Загрузка БОЛЬШИХ файлов посредством ajax barcelona jQuery 7 12.10.2012 03:37
SWFUpload - отображение выбранных файлов Барин AJAX и COMET 2 17.07.2011 10:07