Качване на множество изображения с предварителен преглед

Създадох програма за качване на изображения, но тя не работи правилно. Не мога да разбера къде греша. JSFIDDLE на моя инструмент за качване на изображения е даден по-долу:

JSFIDDLE

Проблемът, с който се сблъсквам, е, че когато щракна върху избор на файлове и избера повече от един файл и го отворя, исках да показва визуализацията на всички изображения, които съм избрал и работи правилно, но когато щракна върху бутона за изтриване, той само изтрива визуализацията, което означава, че ако изпратя файловете, дори тези файлове, които съм изтрил, ще бъдат качени. От друга страна трябва да щракна върху бутона Добавяне на още изображения, за да създам още една програма за качване, както по-горе, но когато добавя няколко изображения, тя не показва визуализация, така че дори не мога да избера или изтрия изображенията, които съм избрал по погрешка. Някой може ли да намери къде бъркам. Имам нужда и от този бутон за добавяне на още изображения, така че ако забравим да добавим някои изображения или изображенията са в различна директория, можем да извикаме още един тип входен файл и той трябва да функционира по същия начин като предишния.


person Hardik Sisodia    schedule 11.05.2015    source източник


Отговори (2)


И така, вие правехте някои странни неща (като използване на глобална променлива с присвоено цяло число, което предполагам, че сте използвали, за да следите вашите обекти).

Изчистих това, което се случваше, и премахнах някои излишни функции. По същество трябваше да използвате по-добре функцията JavaScript FileReader() . Ще трябва да погледнете по-отблизо вашите бутони; тъй като не ги поправих за вас. ;)

Това, което трябваше да направите, беше да преминете през вашия масив this.files и да покажете резултатите с помощта на функцията FileReader(). Код по-долу.

    $('#add_more').click(function() {
      "use strict";
      $(this).before($("<div/>", {
        id: 'filediv'
      }).fadeIn('slow').append(
        $("<input/>", {
          name: 'file[]',
          type: 'file',
          id: 'file',
          multiple: 'multiple',
          accept: 'image/*'
        })
      ));
    });

    $('#upload').click(function(e) {
      "use strict";
      e.preventDefault();

      if (window.filesToUpload.length === 0 || typeof window.filesToUpload === "undefined") {
        alert("No files are selected.");
        return false;
      }

      // Now, upload the files below...
      // https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications#Handling_the_upload_process_for_a_file.2C_asynchronously
    });

    function deletePreview(ele, i) {
      "use strict";
      try {
        $(ele).parent().remove();
        window.filesToUpload.splice(i, 1);
      } catch (e) {
        console.log(e.message);
      }
    }

    $("#file").on('change', function() {
      "use strict";

      // create an empty array for the files to reside.
      window.filesToUpload = [];

      if (this.files.length >= 1) {
        $("[id^=previewImg]").remove();
        $.each(this.files, function(i, img) {
          var reader = new FileReader(),
            newElement = $("<div id='previewImg" + i + "' class='abcd'><img /></div>"),
            deleteBtn = $("<span class='delete' onClick='deletePreview(this, " + i + ")'>delete</span>").prependTo(newElement),
            preview = newElement.find("img");

          reader.onloadend = function() {
            preview.attr("src", reader.result);
            preview.attr("alt", img.name);
          };

          try {
            window.filesToUpload.push(document.getElementById("file").files[i]);
          } catch (e) {
            console.log(e.message);
          }

          if (img) {
            reader.readAsDataURL(img);
          } else {
            preview.src = "";
          }

          newElement.appendTo("#filediv");
        });
      }
    });
#formdiv {
  text-align: center;
}
#file {
  color: green;
  padding: 5px;
  border: 1px dashed #123456;
  background-color: #f9ffe5;
}
#img {
  width: 17px;
  border: none;
  height: 17px;
  margin-left: -20px;
  margin-bottom: 191px;
}
.upload {
  width: 100%;
  height: 30px;
}
.abcd {
  text-align: center;
  position: relative;
}
.abcd img {
  height: 200px;
  width: 200px;
  padding: 5px;
  border: 1px solid rgb(232, 222, 189);
}
.delete {
  color: red;
  font-weight: bold;
  position: absolute;
  top: 0;
  cursor: pointer
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="formdiv">
  <div id="filediv">
    <input type="file" id="file" name="files[]" multiple="multiple" accept="image/*" title="Select Images To Be Uploaded">
    <br>
  </div>
  <input type="button" id="add_more" class="upload" value="Add More Images" />
  <input type="submit" name="submit" value="Add Product" class="upload" id="upload" title="Add Product To The Inventory">
</div>

person kneeki    schedule 11.05.2015
comment
Това работи добре. Но тук има друг проблем, създадох също бутон за изтриване (икона с кръст), който беше показан на изображението, така че да можем да премахнем изображението, ако е избрано по погрешка, но сега то не се показва там. - person Hardik Sisodia; 12.05.2015
comment
Това не би трябвало да е ужасно трудно да се добави. Вижте как добавих областта newElement = $("<div id='previewImg" + i + "' class='abcd'><img /></div>")? Точно под него направете същото, само създайте икона с кръст за изтриване. След това свържете атрибута onClick с идентификатора на newElement. Опитай го. Ако закъсате, уведомете ме. - person kneeki; 12.05.2015
comment
Опитах се да направя точно това, което казахте, но след това спря да показва визуализация на изображенията, които избрах да кача, и ми показа броя на изображенията, които се качват, и дори бутонът за добавяне на още спря да работи, след като вмъкнах нова променлива за изтриване на изображение. - person Hardik Sisodia; 13.05.2015
comment
Добавих бутона за изтриване към моя оригинален отговор. - person kneeki; 13.05.2015
comment
но това изтрива визуализацията само ако видите там дори след като изтриете изображение, броят там остава същият, това означава, че се изтрива само визуализацията, но когато изпратя формуляра, той също ще качи изтритото изображение, нали? - person Hardik Sisodia; 16.05.2015
comment
Добре, това ще изтрие само визуализацията. Доколкото ми е известно, масивът от списък с файлове се чете само. Ето друга публикация по темата. - person kneeki; 16.05.2015
comment
Видях връзката, предоставена от вас, но все още не мога да разбера, след като добавим бутона за изтриване, как можем да изтрием файловете от избраните файлове, опитах също различни методи, но все още не успях да завърша този Image Uploader. Отидох също на тази връзка и видях Обработка на процеса на качване за файл, но мисля, че това също помага за изтриването само на визуализациите, но не и на файловете от секцията за избор на файл. - person Hardik Sisodia; 18.05.2015
comment
Актуализирах своя фрагмент, за да включва премахването на файлове от масив (window.filesToUpload). По същество, тъй като FileList е масив само за четене, трябва да създадете уникален масив, към който имате привилегии за четене/запис. - person kneeki; 18.05.2015
comment
Опитах актуализирания ви фрагмент, но проблемът все още е същият брой изображения, т.е. изображенията не се изтриват от пътя за избор на файлове, а само от предварителен преглед - person Hardik Sisodia; 22.05.2015
comment
някакви актуализации за моята програма за качване на изображения, все още съм заседнал тук - person Hardik Sisodia; 01.06.2015
comment
Можете ли да публикувате фрагмент (jsfiddle?) с напредъка, който сте постигнали досега? Ще се радвам да помогна. - person kneeki; 08.06.2015
comment
Това е новият актуализиран JsFiddle и тогава, когато дори се опитах да направя функция за качване на изображения за Добавяне на още бутон не излиза с предварителен преглед, няма представа защо? Моля, погледнете актуализирания фрагмент, дори актуализирам фрагмента по въпроса, който бях задал - person Hardik Sisodia; 08.06.2015
comment
Доколкото разбирам, елементът input type="file" е само за четене. Ако искате да имате персонализирана версия, вашият най-безопасен и лесен залог би бил да използвате библиотека като BootStrap FileStyle. Използвайки FileStyle заедно със скриптовете, които вече предоставих, трябва да можете да постигнете точно това, което търсите. - person kneeki; 09.06.2015
comment
Моля, проверете този актуализиран JS Fiddle Добавих скрипта за стартиране и добави $(":file").filestyle('clear');, както е показано във връзката, предоставена от вас в последния коментар, но все пак не се изчисти изображение или определени изображения от бутона за избор на файл, всъщност изчиства всички изображения, но визуализацията все още е налична. И bootstrap промени и моя css за input type="file" как мога да го направя същия, защото това изглежда красиво и дори можем да плъзгаме и пускаме изображения в него правилно.. - person Hardik Sisodia; 09.06.2015
comment
Добре, така че напълно разбирам какво търсите. Въпреки това, не съм сигурен как да постигна функцията, за да дам на потребителя възможността да редактира списъка с файлове /преди/ да ги качи без сериозно хакерство поради ограничението и предпазната мярка за сигурност на input type='file' само за четене. Въпреки това, ето решение, от което се надявам да сте доволни: jsFiddle - person kneeki; 09.06.2015
comment
това е перфектен само един проблем, който е, ако не искам да изтрия всички изображения заедно и да премахна само едно изображение от 5 изображения, т.е. Ако кача 5 изображения заедно, но след това намеря грешно изображение, което може да съм вмъкнал по погрешка, и трябва да го премахна не цялото, така че как мога да направя това? - person Hardik Sisodia; 09.06.2015
comment
Изтриването на много изображения е единственото нещо, което липсва в момента в този инструмент за качване на изображения, останалото е страхотно и много се радвам за вашата подкрепа - person Hardik Sisodia; 09.06.2015
comment
Няма проблем колега. Ако някога разберете как да изтриете едно изображение от FileList, коментирайте тук, за да мога да го проверя. - person kneeki; 09.06.2015
comment
Трябва ли да създадем икона за изтриване или квадратче за отметка, добавяйки към изображението за визуализация, така че да можем да изтрием едно или няколко изображения? Квадратчето за отметка ще работи чудесно предполагам, но се чудех можем ли да свържем това квадратче за отметка с нов бутон за изчистване, който ще изчисти само избраното? - person Hardik Sisodia; 09.06.2015
comment
Прочетете коментарите ми по-горе, afaik не можете да изтриете нито един елемент. Можете да изтриете само всички елементи. - person kneeki; 09.06.2015
comment
Някаква представа как можем да качим имената на всичките 5 изображения в базата данни на mysql, но всички трябва да бъдат качени в различни колони на една и съща таблица?? Например, ако вече има 5 създадени колони в таблица, а именно: first_image_name, second_image_name, third_image_name, fourth_image_name, fifth_image_name & аз избирам 3 изображения от 5 и ги изпращам, така че имената на изображенията от текущото приложение за качване на изображения трябва да се съхраняват по приоритет в различни колони. Надявам се, че ме разбрахте. - person Hardik Sisodia; 11.06.2015
comment
Не съм тествал това, но трябва да е повече от достатъчно, за да ви насочи към правилния път. pasteBin - person kneeki; 11.06.2015
comment
Хей, опитах да вмъкна този Програма за качване на изображения в този формуляр в ред 2-ра колона с изображения, където можете да видите стария Image Uploader, но поради bootstrap css цялата ми страница се обърква и след това дори визуализацията не се показва там как мога да вмъкна тази програма за качване на изображения във формуляра? Можете ли да проверите това къде бъркам? Този JSFIDDLE е нов с нов инструмент за качване на изображения. Моля, проверете, не знам къде бъркам. - person Hardik Sisodia; 14.06.2015
comment
Опитвахте се да заредите защитено несигурно (http) на защитена (https) страница. Поправих тези проблеми. Визуализацията не работи на цигулката по някаква причина, но работи добре, ако направите .html страница и я стартирате. JSFiddle - person kneeki; 15.06.2015
comment
Опитах го, но резултатът все още е същият зареждащ css също смущава моя css файл и поради това уеб дизайнът става много объркан. Има ли друг метод за използване на конкретен css стил на bootstraps, който се прилага само към програмата за качване на изображения, а не към цялата страница? - person Hardik Sisodia; 16.06.2015
comment
Трябва да преминете през всеки клас, който FileStyle използва, и да вземете само тези стилове от файла bootstrap.css и да ги добавите към вашия конкретен CSS файл. - person kneeki; 17.06.2015
comment
Има ли някакъв лесен начин просто да изберете клас, който е необходим за програмата за качване на изображения от bootstrap css, защото този bootstrap CSS е доста голям и премахването само на този конкретен клас от този CSS е много дълъг процес, опитах го, но идва с голяма бъркотия накрая. - person Hardik Sisodia; 22.06.2015
comment
Отидете в техния раздел за персонализиране и деактивирайте всичко, което не искате? Трябва да проверите отново, но мисля, че всичко, от което се нуждаете, е модулът Buttons. - person kneeki; 22.06.2015
comment
Опитах се да направя и това, но въпреки това hr таговете и подравняванията също се засягат. - person Hardik Sisodia; 25.06.2015
comment
Ако преминете през css файла (който е само компонентите на бутона) от bootstrap и се уверите, че там има само .btn класове, това не би трябвало да засегне нищо друго. - person kneeki; 26.06.2015
comment
Опитах и ​​това сега, но въпреки това моят css се влияе и не само толкова, дори се опитах да щракна върху бутона за изчистване и този бутон също излиза с някаква странна грешка и мисля, че действа като бутон за изпращане по-късно, след като редактирам css, напълно объркан .. Когато използвам връзката към уебсайта, предоставена от вас, за да персонализирам bootstrap и след като избера само .btn стойности и го изтегля, получавам 4 файла. Опитах и ​​четирите css, но все още не постигнах успех, колега. - person Hardik Sisodia; 03.07.2015
comment
Ако е възможно, моля, погледнете тази заявка - person Hardik Sisodia; 27.08.2015

Това е първият ми път, когато допринасям за StackOverflow. Надявам се това да помогне на някого. Аз съм сравнително нов в уеб разработката. Въпреки това ще съм благодарен, ако някой може да превърне кода на javascript в цикъл. Кодът по-долу може лесно да качи няколко изображения на сървъра, използвайки техния уникален name="name";

function showPreviewOne(event){
    if(event.target.files.length > 0){
      let src = URL.createObjectURL(event.target.files[0]);
      let preview = document.getElementById("file-ip-1-preview");
      preview.src = src;
      preview.style.display = "block";
    } 
  }
  function myImgRemoveFunctionOne() {
      document.getElementById("file-ip-1-preview").src = "https://i.ibb.co/ZVFsg37/default.png";
    }
    /* **************************************************************************************** */

    function showPreviewTwo(event){
      if(event.target.files.length > 0){
        let src = URL.createObjectURL(event.target.files[0]);
        let preview = document.getElementById("file-ip-2-preview");
        preview.src = src;
        preview.style.display = "block";
      } 
    }
    function myImgRemoveFunctionTwo() {
        document.getElementById("file-ip-2-preview").src = "https://i.ibb.co/ZVFsg37/default.png";
      }
    /* **************************************************************************************************** */
    function showPreviewThree(event){
      if(event.target.files.length > 0){
        let src = URL.createObjectURL(event.target.files[0]);
        let preview = document.getElementById("file-ip-3-preview");
        preview.src = src;
        preview.style.display = "block";
      } 
    }
    function myImgRemoveFunctionThree() {
        document.getElementById("file-ip-3-preview").src = "https://i.ibb.co/ZVFsg37/default.png";
      }
    /* **************************************************************************************************** */
    function showPreviewFour(event){
      if(event.target.files.length > 0){
        let src = URL.createObjectURL(event.target.files[0]);
        let preview = document.getElementById("file-ip-4-preview");
        preview.src = src;
        preview.style.display = "block";
      } 
    }
    function myImgRemoveFunctionFour() {
        document.getElementById("file-ip-4-preview").src = "https://i.ibb.co/ZVFsg37/default.png";
      }
      /* **************************************************************************************** */
  
      function showPreviewFive(event){
        if(event.target.files.length > 0){
          let src = URL.createObjectURL(event.target.files[0]);
          let preview = document.getElementById("file-ip-5-preview");
          preview.src = src;
          preview.style.display = "block";
        } 
      }
      function myImgRemoveFunctionFive() {
          document.getElementById("file-ip-5-preview").src = "https://i.ibb.co/ZVFsg37/default.png";
        }
      /* **************************************************************************************************** */
      function showPreviewSix(event){
        if(event.target.files.length > 0){
          let src = URL.createObjectURL(event.target.files[0]);
          let preview = document.getElementById("file-ip-6-preview");
          preview.src = src;
          preview.style.display = "block";
        } 
      }
      function myImgRemoveFunctionSix() {
          document.getElementById("file-ip-6-preview").src = "https://i.ibb.co/ZVFsg37/default.png";
        }
      /* **************************************************************************************************** */
  body {
    margin:0px;
    padding:0px;
    background:#f1f1f1;
  }
 .image-upload-one{
    grid-area: img-u-one;
    display: flex;
    justify-content: center;
  }
  .image-upload-two{
    grid-area: img-u-two;
    display: flex;
    justify-content: center;
  }
  .image-upload-three{
    grid-area: img-u-three;
    display: flex;
    justify-content: center;
  }
  .image-upload-four{
    grid-area: img-u-four;
    display: flex;
    justify-content: center;
  }
  .image-upload-five{
    grid-area: img-u-five;
    display: flex;
    justify-content: center;
  }
  .image-upload-six{
    grid-area: img-u-six;
    display: flex;
    justify-content: center;
  }

  .image-upload-container{
    display: grid;
    grid-template-areas: 'img-u-one img-u-two img-u-three img-u-four img-u-five img-u-six';
  }
  .center {
    display:inline;
    margin: 3px;
  }

  .form-input {
    width:100px;
    padding:3px;
    background:#fff;
    border:2px dashed dodgerblue;
  }
  .form-input input {
    display:none;
  }
  .form-input label {
    display:block;
    width:100px;
    height: auto;
    max-height: 100px;
    background:#333;
    border-radius:10px;
    cursor:pointer;
  }
  
  .form-input img {
    width:100px;
    height: 100px;
    margin: 2px;
    opacity: .4;
  }

  .imgRemove{
    position: relative;
    bottom: 114px;
    left: 68%;
    background-color: transparent;
    border: none;
    font-size: 30px;
    outline: none;
  }
  .imgRemove::after{
    content: ' \21BA';
    color: #fff;
    font-weight: 900;
    border-radius: 8px;
    cursor: pointer;
  }

  .small{
    color: firebrick;
    font-size:15px;
  }

  @media only screen and (max-width: 700px){
    .image-upload-container{
      grid-template-areas: 'img-u-one img-u-two img-u-three'
       'img-u-four img-u-five img-u-six';
    }
  }
 <div class="image-upload-container">
      <div class="image-upload-one">
        <div class="center">
          <div class="form-input">
            <label for="file-ip-1">
              <img id="file-ip-1-preview" src="https://i.ibb.co/ZVFsg37/default.png">
              <button type="button" class="imgRemove" onclick="myImgRemoveFunctionOne()"></button>
            </label>
            <input type="file"  name="img_one" id="file-ip-1" accept="image/*" onchange="showPreviewOne(event);">
          </div>
          <small class="small">Use the &#8634; icon to reset the image</small>
        </div>
      </div>
      <!-- ************************************************************************************************************ -->
      <div class="image-upload-two">
        <div class="center">
          <div class="form-input">
            <label for="file-ip-2">
              <img id="file-ip-2-preview" src="https://i.ibb.co/ZVFsg37/default.png">
              <button type="button" class="imgRemove" onclick="myImgRemoveFunctionTwo()"></button>
            </label>
            <input type="file" name="img_two" id="file-ip-2" accept="image/*" onchange="showPreviewTwo(event);">
          </div>
          <small class="small">Use the &#8634; icon to reset the image</small>
        </div>
      </div>

      <!-- ************************************************************************************************************ -->
      <div class="image-upload-three">
        <div class="center">
          <div class="form-input">
            <label for="file-ip-3">
              <img id="file-ip-3-preview" src="https://i.ibb.co/ZVFsg37/default.png">
              <button type="button" class="imgRemove" onclick="myImgRemoveFunctionThree()"></button>
            </label>
            <input type="file" name="img_three" id="file-ip-3" accept="image/*" onchange="showPreviewThree(event);">
          </div>
          <small class="small">Use the &#8634; icon to reset the image</small>
        </div>
      </div>
      <!-- *********************************************************************************************************** -->
        <div class="image-upload-four">
          <div class="center">
            <div class="form-input">
              <label for="file-ip-4">
                <img id="file-ip-4-preview" src="https://i.ibb.co/ZVFsg37/default.png">
                <button type="button" class="imgRemove" onclick="myImgRemoveFunctionFour()"></button>
              </label>
              <input type="file" name="img_four" id="file-ip-4" accept="image/*" onchange="showPreviewFour(event);">
            </div>
            <small class="small">Use the &#8634; icon to reset the image</small>
          </div>
        </div>
        <!-- ************************************************************************************************************ -->
        <div class="image-upload-five">
          <div class="center">
            <div class="form-input">
              <label for="file-ip-5">
                <img id="file-ip-5-preview" src="https://i.ibb.co/ZVFsg37/default.png">
                <button type="button" class="imgRemove" onclick="myImgRemoveFunctionFive()"></button>
              </label>
              <input type="file" name="img_five" id="file-ip-5" accept="image/*" onchange="showPreviewFive(event);">
            </div>
            <small class="small">Use the &#8634; icon to reset the image</small>
          </div>
        </div>
  
        <!-- ************************************************************************************************************ -->
        <div class="image-upload-six">
          <div class="center">
            <div class="form-input">
              <label for="file-ip-6">
                <img id="file-ip-6-preview" src="https://i.ibb.co/ZVFsg37/default.png">
                <button type="button" class="imgRemove" onclick="myImgRemoveFunctionSix()"></button>
              </label>
              <input type="file" name="img_six" id="file-ip-6" accept="image/*" onchange="showPreviewSix(event);">
            </div>
            <small class="small">Use the &#8634; icon to reset the image</small>
          </div>
        </div>

      <!-- ************************************************************************************************************** -->
    </div>
    

person Eric Coetzee    schedule 12.06.2020
comment
Моля, не задавайте въпрос в отговор на въпрос на някой друг. Започнете нов въпрос. Благодаря. Късмет. - person Hoppo; 12.06.2020