Введення файлу Bootstrap 4


81

Я борюся з браузером файлів bootstrap 4. Якщо я використовую custom-file-control, я постійно бачитиму Вибрати значення файлу. https://v4-alpha.getbootstrap.com/components/forms/#file-browser

Я хотів би змінити значення файла вибору після того, як файл вибрано. Це значення насправді приховане в css, .custom-file-control:lang(en)::afterі я не знаю, як отримати до нього доступ і змінити його в javascript. Я можу отримати значення вибраного файлу так:

document.getElementById("exampleInputFile").value.split("\\").pop();

не мені потрібно змінюватися

.custom-file-control:lang(en)::after {
    content: "Choose file...";
}

якось

посилання: http://codepen.io/Matoo125/pen/LWobNp


На це питання вже було дано відповідь тут: stackoverflow.com/questions/37713126/…
Натаніель Флік,

насправді, я запитав, як змінити вміст властивості css, тому що саме там Bootstrap 4 відображає текст у цьому підході. Я не бачу значення
Matej Vrzala M4

але я хочу отримати доступ до нього динамічно на основі введеного значення. Як я можу це зробити за допомогою css?
Matej Vrzala M4

По-перше, чи вдалося вам змінити значення заповнювача / кнопки за допомогою CSS? На процес вибору значення було дано відповідь в іншому питанні
Зім,

Я можу вибрати значення за допомогою JS, але в завантажувальному файлі 4 це значення "заповнювача" знаходиться в :: after {content: "..."}, і мені потрібно змінити це, щоб побачити зміни
Matej Vrzala M4,

Відповіді:


108

Оновлено 2016 р

Бутстрап 4.4

Відображення вибраного імені файлу також може здійснюватися за допомогою простого JavaScript. Ось приклад, який передбачає стандартний вхідний файл-файл із міткою, який є наступним елементом-братом для введення ...

document.querySelector('.custom-file-input').addEventListener('change',function(e){
  var fileName = document.getElementById("myInput").files[0].name;
  var nextSibling = e.target.nextElementSibling
  nextSibling.innerText = fileName
})

https://codeply.com/p/LtpNZllird

Bootstrap 4.1+

Тепер у Bootstrap 4.1 текст заповнювача "Вибрати файл ..." встановлюється в custom-file-label:

<div class="custom-file" id="customFile" lang="es">
        <input type="file" class="custom-file-input" id="exampleInputFile" aria-describedby="fileHelp">
        <label class="custom-file-label" for="exampleInputFile">
           Select file...
        </label>
</div>

Зміна тексту кнопки "Огляд" вимагає трохи додаткового CSS або SASS. Також зверніть увагу, як працює переклад мови за допомогою lang=""атрибута.

.custom-file-input ~ .custom-file-label::after {
    content: "Button Text";
}

https://codeply.com/go/gnVCj66Efp (CSS)
https://codeply.com/go/2Mo9OrokBQ (SASS)

Ще один варіант Bootstrap 4.1

Крім того, ви можете використовувати цей користувальницький плагін введення файлу

https://www.codeply.com/go/uGJOpHUd8L/file-input


Bootstrap 4 Alpha 6 (оригінальна відповідь)

Думаю, тут є 2 окремі питання ..

<label class="custom-file" id="customFile">
        <input type="file" class="custom-file-input">
        <span class="custom-file-control form-control-file"></span>
</label>

1 - Як змінюється початковий заповнювач та текст кнопки

У Bootstrap 4 початкове значення заповнювача встановлюється на custom-file-controlз псевдоелементом CSS ::afterна основі мови HTML. Початкова кнопка файлу (яка насправді не кнопка, але схожа на одну) встановлюється за допомогою псевдоелемента CSS ::before. Ці значення можна замінити за допомогою CSS.

#customFile .custom-file-control:lang(en)::after {
  content: "Select file...";
}

#customFile .custom-file-control:lang(en)::before {
  content: "Click me";
}

2 - Як отримати вибране значення імені файлу та оновити вхідні дані, щоб показати значення.

Після вибору файлу значення можна отримати за допомогою JavaScript / jQuery.

$('.custom-file-input').on('change',function(){
    var fileName = $(this).val();
})

Однак, оскільки текст заповнювача для введення є псевдоелементом, немає простого способу маніпулювати цим за допомогою Js / jQuery . Однак ви можете мати інший клас CSS, який приховує псевдо вміст, коли файл вибрано ...

.custom-file-control.selected:lang(en)::after {
  content: "" !important;
}

Використовуйте jQuery для перемикання .selectedкласу .custom-file-controlпісля вибору файлу. Це приховає початкове значення заповнювача. Потім вкажіть значення імені файлу в .form-control-fileінтервалі ...

$('.custom-file-input').on('change',function(){
  var fileName = $(this).val();
  $(this).next('.form-control-file').addClass("selected").html(fileName);
})

Потім ви можете впоратися із завантаженням файлу або повторним виділенням за потреби.

Демонстрація на Codeply (альфа 6)


8
C:\fakepath\...дуже смішно.
Gringo Suave

1
Звідки це C:\fakepath\...?
user14717

1
@ZimSystem Дякую за рішення. Я отримую той самий C: \ fakepath \ .. у версії розробника Firefox, чи є спосіб це виправити?
Мена

6
Я використав це, щоб отримати ім'я файлу без "fakepath":var fileName = document.getElementById("upload-image-input").files[0].name;
его

1
Я припускаю, що це колись змінилося, але тепер ви можете просто змінити видимий текстовий фрагмент, встановивши текст spanтегу
Kristof Komlossy

74

Я просто вирішив це таким чином

HTML:

<div class="custom-file">
   <input id="logo" type="file" class="custom-file-input">
   <label for="logo" class="custom-file-label text-truncate">Choose file...</label>
</div>

JS:

$('.custom-file-input').on('change', function() { 
   let fileName = $(this).val().split('\\').pop(); 
   $(this).next('.custom-file-label').addClass("selected").html(fileName); 
});

Примітка : Дякуємо ajax333221 за згадку про .text-truncateклас, який приховає переповнення всередині мітки, якщо вибране ім'я файлу занадто довге.


1
Дякую за .split('\\').pop()участь!
spaceemotion

@spaceemotion щасливо, що це допомогло
Elnoor

1
FWIW, мені довелося додати type="file"до <input>тегу. Але інакше працював чудово.
ghukill

1
@ghukill моя відповідь була швидким дизайном, але я просто додаю typeатрибут теж для тих, хто копіює. Дякую
Елнур

5
Варто сказати, що ви можете приховати переповнення текстовим усіченням таким чиномclass='custom-file-label text-truncate'
ajax333221

16

Починаючи з Bootstrap 4.3, ви можете змінити текст заповнювача та кнопки всередині тегу мітки:

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />

<div class="custom-file">
  <input type="file" class="custom-file-input" id="exampleInputFile">
  <label class="custom-file-label" for="exampleInputFile" data-browse="{Your button text}">{Your placeholder text}</label>
</div>


Чи можете ви надати посилання на документацію Bootstrap?
Абдельсалам Шахлол


9

Для зміни мови браузера файлів:
Як альтернативу згаданому ZimSystem (замінити CSS), більш елегантне рішення пропонується документами bootstrap: побудуйте власні стилі завантаження, додавши мови в SCSS.
Про це читайте тут: https: //getbootstrap.com/docs/4.0/components/forms/#file-browser

Примітка : для того, щоб це працювало, у вашому документі потрібно правильно встановити атрибут lang

Для оновлення значення при виборі файлу:
Ви можете зробити це за допомогою вбудованого js так:

   <label class="custom-file">
      <input type="file" id="myfile" class="custom-file-input" onchange="$(this).next().after().text($(this).val().split('\\').slice(-1)[0])">
      <span class="custom-file-control"></span>
   </label>

Примітка : .split('\\').slice(-1)[0]частина видаляє префікс C: \ fakepath \


3
Приємно. Використовуючи це, щоб додати до всіх введених користувацьких файлів:$('.custom-file-input').change(function () { $(this).next().after().text($(this).val().split('\\').slice(-1)[0]); });
Джейсон,

4

Bootstrap 4

Детальніше тут https://learncodeweb.com/snippets/browse-button-in-bootstrap-4-with-select-image-preview/

Сьогодні мені потрібно створити кнопку перегляду з опцією багатозавантажуваних файлів, і всі наведені вище фрагменти мені не підходять.

Офіційний приклад Bootstrap теж не працює , коли я вибрати кілька файлів.

Я придумав цей код, можливо, допоможе іншим у майбутньому.

<div class="container mt-5">
  <h1 class="text-center">Bootstrap 4 Upload multiple files</h1>
  <div class="col-sm-4 mr-auto ml-auto border p-4">
  <form method="post" enctype="multipart/form-data" action="upload.php">
    <div class="form-group">
      <label><strong>Upload Files</strong></label>
      <div class="custom-file">
        <input type="file" name="files[]" multiple class="custom-file-input form-control" id="customFile">
        <label class="custom-file-label" for="customFile">Choose file</label>
      </div>
    </div>
    <div class="form-group">
      <button type="submit" name="upload" value="upload" id="upload" class="btn btn-block btn-dark"><i class="fa fa-fw fa-upload"></i> Upload</button>
    </div>
  </form>
</div>

Код js наведено нижче.

$(document).ready(function() {
  $('input[type="file"]').on("change", function() {
    let filenames = [];
    let files = document.getElementById("customFile").files;
    if (files.length > 1) {
      filenames.push("Total Files (" + files.length + ")");
    } else {
      for (let i in files) {
        if (files.hasOwnProperty(i)) {
          filenames.push(files[i].name);
        }
      }
    }
    $(this)
      .next(".custom-file-label")
      .html(filenames.join(","));
  });
});

Приклад робочого коду наведено тут із bootstrap 3 та bootstrap 4.3.1.

https://codepen.io/mianzaid/pen/GeEbYV


1
Власне, найкорисніша для мене відповідь, так +1. Невелике вдосконалення: додайте до елемента мітки клас «контроль форми».
Олдбой

2

На випадок, якщо вам не потрібно рішення jQuery

<label class="custom-file">
      <input type="file" id="myfile" class="custom-file-input" onchange="this.nextElementSibling.innerText = this.files[0].name">
      <span class="custom-file-control"></span>
</label>

2

Ось відповідь із вилученою синьою рамкою-тінню, межею, контуром із виправленням імені файлу у введеному користувацьким файлом завантажувального файлу на ім'я файлу вибору, і якщо ви не вибрали жодного файлу, то покажіть Не вибраний файл .

    $(document).on('change', 'input[type="file"]', function (event) { 
        var filename = $(this).val();
        if (filename == undefined || filename == ""){
        $(this).next('.custom-file-label').html('No file chosen');
        }
        else 
        { $(this).next('.custom-file-label').html(event.target.files[0].name); }
    });
    input[type=file]:focus,.custom-file-input:focus~.custom-file-label {
        outline:none!important;
        border-color: transparent;
        box-shadow: none!important;
    }
    .custom-file,
    .custom-file-label,
    .custom-file-input {
        cursor: pointer;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" rel="stylesheet"/>
    <div class="container py-5">
    <div class="input-group mb-3">
      <div class="input-group-prepend">
        <span class="input-group-text">Upload</span>
      </div>
      <div class="custom-file">
        <input type="file" class="custom-file-input" id="inputGroupFile01">
        <label class="custom-file-label" for="inputGroupFile01">Choose file</label>
      </div>
    </div>
    </div>



1

За допомогою jquery це можна зробити так. Код:

$("input.custom-file-input").on("change",function(){if(this.files.length){var filename=this.file[0].name;if(filename.length>23){filename=filename.substr(0,11)+"..."+filename.substr(-10);}$(this).siblings(".custom-file-label").text(filename);}});

1

Ви можете спробувати вказаний нижче фрагмент, щоб відобразити вибране ім'я файлу з типу введення файлу .

document.querySelectorAll('input[type=file]').forEach( input => {
    input.addEventListener('change', e => {
        e.target.nextElementSibling.innerText = input.files[0].name;
    });
});

0

Рішення, засноване на відповіді @Elnoor, але робота з кількома введеними формами для завантаження файлів і без "зламу фальшивого шляху":

HTML:

<div class="custom-file">
    <input id="logo" type="file" class="custom-file-input" multiple>
    <label for="logo" class="custom-file-label text-truncate">Choose file...</label>
</div>

JS:

$('input[type="file"]').on('change', function () {
    let filenames = [];
    let files = document.getElementById('health_claim_file_form_files').files;

    for (let i in files) {
        if (files.hasOwnProperty(i)) {
            filenames.push(files[i].name);
        }
    }

    $(this).next('.custom-file-label').addClass("selected").html(filenames.join(',    '));
});

0

Bootstrap 4.4:

Покажіть choose fileбар. Після вибору файлу покажіть ім'я файлу разом із його розширенням

<div class="custom-file">
    <input type="file" class="custom-file-input" id="idEditUploadVideo"
     onchange="$('#idFileName').html(this.files[0].name)">
    <label class="custom-file-label" id="idFileName" for="idEditUploadVideo">Choose file</label>
</div>

0

Якщо ви хочете використовувати його глобально на всіх користувацьких входах, використовуйте наступний код jQuery:

$(document).ready(function () {
    $('.custom-file-input').on('change', function (e) {
         e.target.nextElementSibling.innerHTML = e.target.files[0].name;
    });
});

0

Для Bootstrap v.5

document.querySelectorAll('.form-file-input')
        .forEach(el => el.addEventListener('change', e => e.target.parentElement.querySelector('.form-file-text').innerText = e.target.files[0].name));

Впливає на всі елементи введення файлу. Не потрібно вказувати ідентифікатор елементів.


-1
 <!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">

    <title>Hello, world!</title>
  </head>
  <body>
    <h1>Hello, world!</h1>
  <div class="custom-file">
    <input type="file" class="custom-file-input" id="inputGroupFile01">
    <label class="custom-file-label" for="inputGroupFile01">Choose file</label>
  </div>
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
 <script>
$(function() {
  $(document).on('change', ':file', function() {var input = $(this), numFiles = input.get(0).files ? input.get(0).files.length : 1,
        label = input.val().replace(/\\/g, '/').replace(/.*\//, '');input.trigger('fileselect', [numFiles, label]);
  });
  $(document).ready( function() {
      $(':file').on('fileselect', function(event, numFiles, label) {var input = $(this).parents('.custom-file').find('.custom-file-label'),
      log = numFiles > 1 ? numFiles + ' files selected' : label;if( input.length ) {input.text(log);} else {if( log ) alert(log);}});
  });
});
 </script>
  </body>
</html>

-1

Без JQuery

HTML:

<INPUT type="file" class="custom-file-input"  onchange="return onChangeFileInput(this);">

JS:

function onChangeFileInput(elem){
  var sibling = elem.nextSibling.nextSibling;
  sibling.innerHTML=elem.value;
  return true;
}

KliG

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.