2015-10-27 2 views
0

У меня есть немного html с областью, где пользователь может перетаскивать файлы для загрузки. Вложенная внутри, кнопка «просматривать файлы», которая содержит clicks() скрытый входной файл, если они выбирают традиционный метод загрузки. До сих пор все хорошо работает, за исключением того, что если пользователь перетаскивает и удаляет несколько файлов (более одного), он загружает каждый из них дважды (3 раза удаленных файла загружает 6 файлов). Он не делает этого, если пользователь загружает через кнопку «Просмотр файлов», поэтому я сузил ее до своей функции ondrop и включил ее ниже. Я могу опубликовать дополнительный код, если проблема не в этом блоке кода.Javascript, загружающий дубликаты

Обновление: я зарегистрировал свою переменную droppedfile на консоли один раз перед циклом for и один раз после этого и заметил, что при регистрации после цикла for и 2 файла была отключена переменная содержала 2 списка файлов и каждый список содержал оба файла (делая 4 загрузки). Как мой цикл for изменяет мою переменную?

dropzone.ondrop = function(e){ 
    e.preventDefault(); 
    this.className = 'dropzone'; 
    var droppedfile = e.target.files || e.dataTransfer.files; 
    for (i=0; i < droppedfile.length; i++) { 
     if(droppedfile[i].type != "text/plain" && droppedfile[i].type != "application/pdf" && droppedfile[i].type != "application/msword"){ 
      alert(droppedfile[i].type + " file types are not allowed."); 
     }else{ 
      uploadButton.innerHTML = 'Uploading...'; 
      //calls a function that assigns the file to a new formdata obj and sends via ajax      
      upload(droppedfile); 

     } 
    } 
} 

ответ

1

Проблема возникает из-за того, что вы загружаете оба файла каждый раз, когда выполняется цикл for. Заменить

upload(droppedfile); 

WITN

upload(droppedfile[i]); 

В качестве альтернативы Вы можете гарантировать, что все файлы действительны перед загрузкой

var valid=true; 
for (i=0; i < droppedfile.length; i++) { 
    if(droppedfile[i].type != "text/plain" && droppedfile[i].type != "application/pdf" && droppedfile[i].type != "application/msword"){ 
     alert(droppedfile[i].type + " file types are not allowed."); 
     valid=false; 
    } 
} 
if(valid) { 
    uploadButton.innerHTML = 'Uploading...';      
    upload(droppedfile); 
} 
+0

Я только что вернулся к сообщению, что я понял это. Я фактически переместил вызов функции для загрузки вне цикла for. Считаете ли вы, что было бы более чистым, если бы я использовал try/catch для обработки ошибок, когда пользователь удаляет непринятый тип файла? – exeleon

+0

Использование пробной уловки здесь не представляется необходимым, так как у вас есть простое различие между допустимым и недопустимым файлом. Однако одна вещь, которую вы можете сделать, - удалить недопустимый файл из очереди и выяснить, можете ли вы загрузить оставшиеся файлы и продолжить их. Используйте try catch, если у вас есть еще несколько проверок, прежде чем разрешить загрузку файлов, например, поврежденные файлы или файлы за пределами определенного размера. – Kalyan

Смежные вопросы