Bootstrap 4文件输入


76

我正在使用bootstrap 4文件浏览器。如果我使用自定义文件控件,则会一直看到“选择文件值”。 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更改了占位符/按钮的值?选择值的过程已在另一个问题中得到解答
Zim

我可以使用JS选择值,但是在引导程序4中,此“占位符”值位于:: after {content:“ ...”}中,我需要更改该值以查看更改
Matej Vrzala M4

Answers:


104

2016年更新

Bootstrap 4.4

显示选定的文件名也可以使用纯JavaScript完成。这是一个示例,假定带有标签的标准custom-file-input是输入的下一个兄弟元素...

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中,使用基于HTML语言的CSS伪元素在上设置初始占位符值。初始文件按钮(实际上不是按钮,但看起来像一个按钮)是使用CSS伪元素设置的。这些值可以用CSS覆盖。custom-file-control::after::before

#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上的演示(alpha 6)


8
C:\fakepath\...非常有趣。
Gringo Suave

1
C:\fakepath\...是哪里来的?
user14717

1
@ZimSystem感谢您的解决方案。我在firefox开发人员版中得到的是C:\ fakepath \ ..,有没有办法解决这个问题?
娜娜(Mena)

6
我用它来获取没有“ fakepath”的文件名:var fileName = document.getElementById("upload-image-input").files[0].name;
ego

1
我认为它在某个时候发生了变化,但是现在您可以通过设置span标签的文本来简单地更改可见的文本片段
Kristof Komlossy

70

我只是这样解决了

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对于那些将要复制的人,我也只会添加该属性。谢谢
Elnoor

5
值得一说的是,您可以像这样用文本截断来隐藏溢出class='custom-file-label text-truncate'
ajax333221 '18

16

Bootstrap 4.3开始,您可以在label标签内更改占位符和按钮文本:

<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文档的链接吗?
Abdelsalam Shahlol

1
@AbdelsalamShahlol-getbootstrap.com/ docs
Andrei Veshtard '19

9

要更改文件浏览器的语言:
作为ZimSystem提到的替代(覆盖CSS)的替代方案,引导文档建议了一种更为优雅的解决方案:通过在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]); });
Jason

4

引导程序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(","));
  });
});

此处使用引导程序3和引导程序4.3.1给出工作代码示例。

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


1
实际上,对我来说最有用的答案是+1。小改进:向标签元素添加“ form-control”类。
老男孩”

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

以防万一,如果您不需要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>

1

您可以尝试在给定的代码段下方显示从文件输入类型中选择的文件名。

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

0

基于@Elnoor答案的解决方案,但使用多个文件上传表单输入且没有“ fakepath hack”:

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

影响所有文件输入元素。无需指定元素ID。


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

克力

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.