Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Мультизагрузка картинок (https://javascript.ru/forum/misc/72146-multizagruzka-kartinok.html)

LingVist 11.01.2018 20:57

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

Есть форма и инпут типа '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");
    }
}


Спасибо

Nexus 11.01.2018 21:16

Нужно удалять все превью, когда пользователь просто закрывает окно выбора файла, т.к. все выбранные до этого файлы "сбрасываются".
После строки 11:
if(!files.length)
    output.innerHTML='';

LingVist 11.01.2018 21:28

Цитата:

Сообщение от Nexus (Сообщение 474876)
Нужно удалять все превью, когда пользователь просто закрывает окно выбора файла, т.к. все выбранные до этого файлы "сбрасываются".
После строки 11:
if(!files.length)
    output.innerHTML='';

Вставил после 11-й строки, все осталось по-прежнему

рони 11.01.2018 21:31

Nexus,
похоже вопрос в том как отправить ВСЕ картинки из output на сервер?

LingVist 11.01.2018 21:33

Цитата:

Сообщение от рони (Сообщение 474880)
Nexus,
похоже вопрос в том как отправить ВСЕ картинки из output на сервер?

Они и отправляются, но если выбирать кучей. А если по одной добавлять, то отправляется последняя

Nexus 11.01.2018 21:45

<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>

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

Чтобы реализовать возможность последовательного/поочередного выбора изображений для загрузки нужно либо сохранять выбранные пользователем изображения в переменной и отправлять их на сервер скриптом, либо каждый раз клонировать поле выбора файла (в этом случае обработчик лучше делегировать ближайшему родителю).

Nexus 11.01.2018 21:49

рони, вероятно вы правы.

laimas 11.01.2018 21:55

Цитата:

Сообщение от Nexus
сохранять выбранные пользователем изображения в переменной

И оставить пользователя без памяти. )

рони 11.01.2018 21:58

LingVist,
копайте в сторону FormData

Nexus 11.01.2018 21:58

Цитата:

Сообщение от laimas
И оставить пользователя без памяти. )

Угу, как ни посмотри - наиболее геморойный вариант.


Часовой пояс GMT +3, время: 16:05.