Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.01.2018, 20:57
Аспирант
Отправить личное сообщение для LingVist Посмотреть профиль Найти все сообщения от LingVist
 
Регистрация: 21.09.2010
Сообщений: 39

Мультизагрузка картинок
Доброго дня всем

Есть форма и инпут типа 'file' с атрибутом 'multiple'. Также имется предпросмотр выбранных картинок.

Когда юзер выбирает сразу несколько изображений, то они все попадают в массив $_FILES и все работает нормально.

Но если юзер выбирает одну картинку, закрывает окно выбора, потом следующую и т.д., то в массив $_FILES попадает последняя. При этом в окне предпросмотра все они показываются нормально.

Такой вопрос - как их объединить, чтобы все работало так, как будто выбираются сразу несколько файлов?

Код предпросмотра
window.onload = function(){
        
    //Check File API support
    if(window.File && window.FileList && window.FileReader){
        var filesInput = document.getElementById("files");
        
        filesInput.addEventListener("change", function(event){
            
            var files = event.target.files; //FileList object
            var output = document.getElementById("result");
            
            for(var i = 0; i< files.length; i++){
                var file = files[i];                
                //Only pics
                if(!file.type.match('image'))
                  continue;
                
                var picReader = new FileReader();
                
                picReader.addEventListener("load",function(event){                    
                    var picFile = event.target;
                    var div = document.createElement("div");
                    div.className = 'img_preview';
                    div.innerHTML = "<img class='thumbnail' src='" + picFile.result + "'" +
                            "title='" + picFile.name + "'/>";                    
                    output.insertBefore(div,null); 
                    
                
                });                
                 //Read the image
                picReader.readAsDataURL(file);
            }                               
           
        });
    }
    else
    {
        console.log("Your browser does not support File API");
    }
}


Спасибо

Последний раз редактировалось LingVist, 11.01.2018 в 21:23.
Ответить с цитированием
  #2 (permalink)  
Старый 11.01.2018, 21:16
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

Нужно удалять все превью, когда пользователь просто закрывает окно выбора файла, т.к. все выбранные до этого файлы "сбрасываются".
После строки 11:
if(!files.length)
    output.innerHTML='';
Ответить с цитированием
  #3 (permalink)  
Старый 11.01.2018, 21:28
Аспирант
Отправить личное сообщение для LingVist Посмотреть профиль Найти все сообщения от LingVist
 
Регистрация: 21.09.2010
Сообщений: 39

Сообщение от Nexus Посмотреть сообщение
Нужно удалять все превью, когда пользователь просто закрывает окно выбора файла, т.к. все выбранные до этого файлы "сбрасываются".
После строки 11:
if(!files.length)
    output.innerHTML='';
Вставил после 11-й строки, все осталось по-прежнему
Ответить с цитированием
  #4 (permalink)  
Старый 11.01.2018, 21:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Nexus,
похоже вопрос в том как отправить ВСЕ картинки из output на сервер?
Ответить с цитированием
  #5 (permalink)  
Старый 11.01.2018, 21:33
Аспирант
Отправить личное сообщение для LingVist Посмотреть профиль Найти все сообщения от LingVist
 
Регистрация: 21.09.2010
Сообщений: 39

Сообщение от рони Посмотреть сообщение
Nexus,
похоже вопрос в том как отправить ВСЕ картинки из output на сервер?
Они и отправляются, но если выбирать кучей. А если по одной добавлять, то отправляется последняя
Ответить с цитированием
  #6 (permalink)  
Старый 11.01.2018, 21:45
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

<input type="file" multiple id="files" accept="image/*"/>
<div id="result"></div>
<style>.thumbnail{max-width:100px;}</style>
<script>
(function(){
  if(!window.File || !window.FileList || !window.FileReader) 
    return console.log("Your browser does not support File API");

  document.getElementById("files").addEventListener("change", function(event) {
    var files = event.target.files,
        output = document.getElementById("result");

    output.innerHTML = '';
    for(var i = 0; i < files.length; i++) {
      var file = files[i];
      if(!file.type.match('image')) 
        continue;

      var picReader = new FileReader();
      picReader.addEventListener("load", function(event) {
        var picFile = event.target;
        var div = document.createElement("div");
        div.className = 'img_preview';
        div.innerHTML = "<img class='thumbnail' src='" 
          + picFile.result + "'" + "title='" + picFile.name + "'/>";
        output.insertBefore(div, null);
      });
      picReader.readAsDataURL(file);
    }
  });
})();
</script>

Сейчас скрипт работает правильно, он всегда отрисовывает только действительно выбранные изображения, которые и будут отправлены на сервер.

Чтобы реализовать возможность последовательного/поочередного выбора изображений для загрузки нужно либо сохранять выбранные пользователем изображения в переменной и отправлять их на сервер скриптом, либо каждый раз клонировать поле выбора файла (в этом случае обработчик лучше делегировать ближайшему родителю).
Ответить с цитированием
  #7 (permalink)  
Старый 11.01.2018, 21:49
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

рони, вероятно вы правы.
Ответить с цитированием
  #8 (permalink)  
Старый 11.01.2018, 21:55
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Nexus
сохранять выбранные пользователем изображения в переменной
И оставить пользователя без памяти. )
Ответить с цитированием
  #9 (permalink)  
Старый 11.01.2018, 21:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

LingVist,
копайте в сторону FormData
Ответить с цитированием
  #10 (permalink)  
Старый 11.01.2018, 21:58
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

Сообщение от laimas
И оставить пользователя без памяти. )
Угу, как ни посмотри - наиболее геморойный вариант.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Плавное пролистывание картинок слайдера Corazon Элементы интерфейса 3 30.01.2017 22:07
Смена картинок на JS. Помогите реализовать! Aggao Элементы интерфейса 3 27.11.2014 23:32
Как можно узнать\вычислить кол-во доступных картинок desertFox Общие вопросы Javascript 5 18.08.2014 14:41
Автопереключатель картинок Vempel Общие вопросы Javascript 0 03.10.2013 18:36
Загрузчик картинок Livanderiaamarum Общие вопросы Javascript 1 15.01.2012 17:21