Jump to content
Sapinn

Preview de multiplos arquivos com inputs diferentes

Recommended Posts

Opa galera. Fiz um preview de imagens através de um input e ele está funcionado bem agora como eu faço para fazer uma mesmo preview em inputs diferentes. Quando coloco mais de um input e seleciona arquivos ele sempre mostra no primeiro input.

Meu codigo:

 

CSS: 

*{

    padding: 0;

    margin: 0;

    box-sizing: border-box;

    font-family: "Rubik",sans-serif;

}

body{

    background-color: #f5f8ff;

}

.container{

    background-color: #ffffff;

    width: 60%;

    min-width: 450px;

    position: relative;

    margin:  50px auto;

    padding: 50px 20px;

    border-radius: 7px;

    box-shadow: 0 20px 35px rgba(0,0,0,0.05);

}

input[type="file"]{

    display: none;

}

label{

    display: block;

    position: relative;

    background-color: #025bee;

    color: #ffffff;

    font-size: 18px;

    text-align: center;

    width: 300px;

    padding: 18px 0;

    margin: auto;

    border-radius: 5px;

    cursor: pointer;

}

.container p{

    text-align: center;

    margin: 20px 0 30px 0;

}

#images{

    width: 80%;

    position: relative;

    margin: auto;

    display: flex;

    justify-content: space-evenly;

    gap: 20px;

    flex-wrap: wrap;

}

figure{

    width: 45%;

}

img{

    width: 100%;

}

figcaption{

    text-align: center;

    font-size: 2.4vmin;

    margin-top: 0.5vmin;

}

 

HTML:

   <div class="container">

        <input type="file" id="file-input" accept=".png, .jpeg, .jpg, .pdf" onchange="preview(this)" multiple>

        <label for="file-input">

            <i class="fas fa-upload"></i>   Escolha seus arquivos

        </label>

        <p id="num-of-files">Nenhum arquivo escolhido</p>

        <div id="images"></div>

    </div>

    <div class="container">

        <input type="file" id="file-input" title="2" accept=".png, .jpeg, .jpg, .pdf" onchange="preview(this)" multiple>

        <label for="file-input">

            <i class="fas fa-upload"></i>   Escolha seus arquivos

        </label>

        <p id="num-of-files">Nenhum arquivo escolhido</p>

        <div id="images"></div>

    </div>

 

JAVASCRIPT:

let fileInput = document.getElementById("file-input");

let inputFile = document.querySelectorAll("#file-input");

let imageContainer = document.getElementById("images");

let numOfFiles = document.getElementById("num-of-files");




function preview(input){

    imageContainer.innerHTML = "";

    numOfFiles.textContent = `${fileInput.files.length} Arquivos selecionados`;

   

   

    for(i of fileInput.files){

        let reader = new FileReader();

        let figure = document.createElement("figure");

        let figCap = document.createElement("figcaption");

        figCap.innerText = i.name;

        figure.appendChild(figCap);

        reader.onload=()=>{

            let img = document.createElement("img");

            if(figCap.innerText.split('.').pop() == 'pdf'){

                img.setAttribute("src","pdf.png");

            }else{

                img.setAttribute("src",reader.result);

            }



            figure.insertBefore(img,figCap);

        }

        imageContainer.appendChild(figure);

        reader.readAsDataURL(i);

    }

}

 

Share this post


Link to post
Share on other sites

Olá!
Da forma como o sr. fez, ids ficaram repetidas. ids devem ser únicas (não podem se repetir)

Crie um wrapper, use classes...
segue sugestão:

<div class="container preview-wrapper">
  <label>
    <input type="file" accept=".png, .jpeg, .jpg, .pdf" multiple>
    <i class="fas fa-upload"></i> Escolha seus arquivos
  </label>
  <p class="num-of-files">Nenhum arquivo escolhido</p>
  <div class="preview-images"></div>
</div>
<div class="container preview-wrapper">
  <label>
    <input type="file" accept=".png, .jpeg, .jpg, .pdf" multiple>
    <i class="fas fa-upload"></i> Escolha seus arquivos
  </label>
  <p class="num-of-files">Nenhum arquivo escolhido</p>
  <div class="preview-images"></div>
</div>
* {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
    font-family: "Rubik", sans-serif;
}

body {
    background-color: #f5f8ff;
}

.container {
    background-color: #ffffff;
    width: 60%;
    min-width: 450px;
    position: relative;
    margin: 50px auto;
    padding: 50px 20px;
    border-radius: 7px;
    box-shadow: 0 20px 35px rgba(0, 0, 0, 0.05);
}

input[type="file"] {
    display: none;
}

label {
    display: block;
    position: relative;
    background-color: #025bee;
    color: #ffffff;
    font-size: 18px;
    text-align: center;
    width: 300px;
    padding: 18px 0;
    margin: auto;
    border-radius: 5px;
    cursor: pointer;
}

.container p {
    text-align: center;
    margin: 20px 0 30px 0;
}

.preview-images {
    width: 80%;
    position: relative;
    margin: auto;
    display: flex;
    justify-content: space-evenly;
    gap: 20px;
    flex-wrap: wrap;
}

figure {
    width: 45%;
}

img {
    width: 100%;
}

figcaption {
    text-align: center;
    font-size: 2.4vmin;
    margin-top: 0.5vmin;
}
const handleFileInput = async e => {
  const fileInput = e.target
  const wrapper = e.currentTarget
  const imagesContainer = wrapper.querySelector('.preview-images')
  const diplayNumOfFiles = wrapper.querySelector('.num-of-files')

  // limpa imagesContainer
  imagesContainer.innerHTML = ''

  // exibe o número de arquivos selecionados
  diplayNumOfFiles.textContent = `${fileInput.files.length} Arquivos selecionados`

  // para cada arquivo selecionado
  for (const file of fileInput.files) {
    const figure = await fileReader(file)
    imagesContainer.append(figure)
  }
}


const fileReader = async (file) => {
  const reader = new FileReader()
  const figure = document.createElement('figure')
  const figCap = document.createElement('figcaption')
  figCap.innerText = file.name
  figure.appendChild(figCap)
  reader.onload = () => {
    let img = document.createElement('img')
    if (figCap.innerText.split('.').pop() == 'pdf') {
      img.setAttribute('src', 'pdf.png')
    } else {
      img.setAttribute('src', reader.result)
    }
    figure.insertBefore(img, figCap)
  }
  await reader.readAsDataURL(file)
  return figure;
}

// encontra todos .preview-wrappers
const previewWrappers = document.querySelectorAll('.preview-wrapper')

// para cada wrapper encontrado
for (const wrapper of previewWrappers) {
  // escuta o evento input
  wrapper.addEventListener('input', handleFileInput)
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Wanderson Moreira
      Bom dia,
      alguém pode me ajudar com uma situação?
      estou utilizando um script pra fazer o carregamento assíncrono do site.
      var links = document.querySelectorAll('a'); function handleClick(event) { event.preventDefault(); fetchPage(event.target.href); window.history.pushState(null, null, event.target.href); window.scrollTo(0, 0); } async function fetchPage(url) { document.querySelector('.content'); var pageResponse = await fetch(url); var pageText = await pageResponse.text(); replaceContent(pageText); } function replaceContent(newText) { var newHtml = document.createElement('div'); newHtml.innerHTML = newText; var oldContent = document.querySelector('.content'); var newContent = newHtml.querySelector('.content'); oldContent.innerHTML = newContent.innerHTML; document.title = newHtml.querySelector('title').innerText; } window.addEventListener('popstate', () => { fetchPage(window.location.href); }) links.forEach(link => { link.addEventListener('click', handleClick); }) O problema em questão é que, o conteúdo da pagina que é carregado dentro da div content não funciona corretamente
       
      os scripts em javascript não são executados;
      os links de navegação da pagina não funcionam de maneira assincrona, diferente dos links de navegação do menu
       
       
    • By Jack Oliveira
      Ola pessoal eu gostaria de saber se teria como e se sim, como fazer para pegar lat e lng quando fazer a busca do endereco pelo cep,
      Tentei buscar uns exemplos de como poderia ser feito, porem não obtive resultado que precisava.
       
      o código a baixo ele funciona sem problema, porem so precisaria pegar esta LAT e LNG 
       
       
      //Buscando endereco plo CEP function limpa_formulário_cep() { //Limpa valores do formulário de cep. document.getElementById('rua').value=(""); document.getElementById('bairro').value=(""); document.getElementById('cidade').value=(""); document.getElementById('uf').value=(""); } function meu_callback(conteudo) { if (!("erro" in conteudo)) { //Atualiza os campos com os valores. document.getElementById('rua').value=(conteudo.logradouro); document.getElementById('bairro').value=(conteudo.bairro); document.getElementById('cidade').value=(conteudo.localidade); document.getElementById('uf').value=(conteudo.uf); } //end if. else { //CEP não Encontrado. limpa_formulário_cep(); alert("CEP não encontrado."); } } function pesquisacep(valor) { //Nova variável "cep" somente com dígitos. var cep = valor.replace(/\D/g, ''); //Verifica se campo cep possui valor informado. if (cep != "") { //Expressão regular para validar o CEP. var validacep = /^[0-9]{8}$/; //Valida o formato do CEP. if(validacep.test(cep)) { document.getElementById('cep').value = cep.substring(0,5) +"-" +cep.substring(5); //Preenche os campos com "..." enquanto consulta webservice. document.getElementById('rua').value="..."; document.getElementById('bairro').value="..."; document.getElementById('cidade').value="..."; document.getElementById('uf').value="..."; //Cria um elemento javascript. var script = document.createElement('script'); //Sincroniza com o callback. script.src = 'https://viacep.com.br/ws/'+ cep + '/json/?callback=meu_callback'; //Insere script no documento e carrega o conteúdo. document.body.appendChild(script); } //end if. else { //cep é inválido. limpa_formulário_cep(); alert("Formato de CEP inválido."); } } //end if. else { //cep sem valor, limpa formulário. limpa_formulário_cep(); } }; </script>  
      <?php // Map($Width, $Height, $StringNome, $StringEndereco, $StringCidade) $LAT = '37.86926'; $LNG = '-122.254811'; ?> <script> // gmap for street view panorama = GMaps.createPanorama({ el: '#MapCanvasStreet', lat : <?= $LAT; ?>, lng : <?= $LNG; ?>, }); </script> Desde já fico grato!!
    • By Jack Oliveira
      Ola pessoal montando um limitador a ser selecionado no SELECT OPTION ele ate faz a contagem  certo etc...
       
      porem não estou conseguindo fazer esta contagem continuar pois ja esta cadastrado no banco o maximo permetido
       
      <div class="col-md-6"> <div class="form-group"> <label>Categorias: </label> <select class="form-control select2" name="categorias[]" id="SelecionaQtdOption" multiple="multiple" data-placeholder="<?php echo $txt['todos_os_mods']; ?>"> <option value="">Selecionar Categorias</option> <?php foreach($categorias as $categoria){ if(strpos($Dados['categorias'], $categoria['titulo']) !== false){ ?> <option selected value="<?= $categoria['titulo']; ?>"><?= $categoria['titulo']; ?></option> <?php } else { ?> <option value="<?= $categoria['titulo']; ?>"><?= $categoria['titulo']; ?></option> <?php } } ?> </select> </div> </div> java esta desta forma
      <?php $QtdCategoria = 3; ?> <script type="text/javascript"> $(document).ready(function() { var selecionarOpiton = null; $('#SelecionaQtdOption').change(function(event) { if ($(this).val().length == <?= $QtdCategoria; ?>) { //Limitar Quantidade de categoria a ser selecionanda no select Option $(this).val(selecionarOpiton); } else { selecionarOpiton = $(this).val(); } }); }); </script>  
    • By gersonab
      Bom dia a todos, preciso aplicar duas máscaras em uma janela modal, não estou conseguindo fazer, fora dela as mascaras funcionam.
      <div class="form-group col-md-4"> <label>Data pagamento</label> <input type="text" name="dataval" class="form-control" id="dataapp"> </div> <div class="form-group col-md-4"> <label>Valor</label> <input type="text" name="valpro" class="form-control" id="money"> </div> utilizo este plugin
      <script src="../plugins/input-mask/jquery.inputmask.bundle.min.js"></script> $("#money").inputmask("999,999,999.999"); $("#dataapp").inputmask("99/99/9999"); desde já agradeço qq ajuda
    • By Jack Oliveira
      Ola pessoal boa noite 
       
      Bom é o seguinte
       
      Como eu posso fazer uma contagem de imagens que poderá ser carregado pelo input  file
      Exemplos 
      <!-- img1 carregar apenas 3 imagens --> <input type="file" name="img1"> <!-- img2 carregar apenas 6 imagens --> <input type="file" name="img2"> <!-- img3 carregar apenas 9 imagens --> <input type="file" name="img3"> <!-- img4 carregar apenas 12 imagens --> <input type="file" name="img4"> Ouver um jeito também de bloquear se for selecionado mais do que for permitido...
       
      Já vi isso em alguns site quando for selecionar as imagens se passar da quantidade ele não seleciona mais nenhuma imagem. 
       
      Se img1 ja tiver as 3 imagens nao permite selecionar ou então ocultar o input se a quantidade ja foi cadastrada..
       
      Se o usuário tiver as 3 imagens e se ele apagou uma ele podera selecionar apenas uma e nada mais...
       
      Se teria como fazer isso apenas com php ou teria que usar jquery ou javascript..
       
      Espero que possam entender..
       
       
      Obs: não precisa ser codigo grande pra pouca coisa; que possa ser mais simplificado possível..
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.