Кнопка завантаження елемента файлу форми завантаження Twitter


573

Чому не існує кнопки завантаження елегантних файлових файлів для завантажувального твітера? Було б солодко, якби для кнопки завантаження була реалізована синя основна кнопка. Чи можливо навіть відточити кнопку завантаження за допомогою CSS? (здається, як власний елемент браузера, яким не можна маніпулювати)


13
Ви можете знайти його тут. markusslima.github.io/bootstrap-filestyle
rh0dium

Відповіді:


972

Ось рішення для Bootstrap 3 та 4.

Щоб створити функціональний елемент керування введенням файлу, який виглядає як кнопка, вам потрібен лише HTML:

HTML

<label class="btn btn-default">
    Browse <input type="file" hidden>
</label>

Це працює у всіх сучасних браузерах, включаючи IE9 +. Якщо вам також потрібна підтримка старого IE, будь ласка, скористайтеся наведеним нижче підходом.

Ця методика спирається на hiddenатрибут HTML5 . Bootstrap 4 використовує наступний CSS, щоб уникнути цієї функції в непідтримуваних браузерах. Можливо, вам доведеться додати, якщо ви використовуєте Bootstrap 3.

[hidden] {
  display: none !important;
}

Спадковий підхід для старого IE

Якщо вам потрібна підтримка IE8 і нижче, використовуйте наступний HTML / CSS:

HTML

<span class="btn btn-default btn-file">
    Browse <input type="file">
</span>

CSS

.btn-file {
    position: relative;
    overflow: hidden;
}
.btn-file input[type=file] {
    position: absolute;
    top: 0;
    right: 0;
    min-width: 100%;
    min-height: 100%;
    font-size: 100px;
    text-align: right;
    filter: alpha(opacity=0);
    opacity: 0;
    outline: none;
    background: white;
    cursor: inherit;
    display: block;
}

Зауважте, що старий IE не запускає введення файлу при натисканні на a <label>, тому CSS "роздуття" виконує декілька речей, щоб обійти це:

  • Робить проміжок введення файлу на повну ширину / висоту навколишнього <span>
  • Робить введення файлу невидимим

Відгуки та додаткове читання

Я розмістив докладніші відомості про цей метод, а також приклади того, як показати користувачеві, які / скільки файлів вибрано:

http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/


52
+ 1 Для мене це, безумовно, найкраща відповідь. Дуже стисле рішення з використанням останньої версії завантажувального пристрою.
Ulises

6
@Ulises @JaredEitnier @IvanWang Я з повагою не згоден. І запропонуйте мою відповідь безсоромну пробку, яка просто використовує <label>елемент. Як найкраще рішення :)
Кирило Фукс

9
Я маю згоду з @KirillFuchs; мітка буде краще. Плюс - користувач не може побачити, чи вибрали правильний файл, оскільки на кнопці не вказано вибране ім'я файлу: jsfiddle.net/36o9pdf9/1
danwild

1
Мітка була б семантично кращою. Перегляньте статтю щодо способу показу, які файли обрані. (Деякі програми завантажуються автоматично, коли вибрано файл, тому в цих випадках відгуки про ім’я файлів не є критичними.)
claviska

1
Я не міг змусити це працювати над IE11 разом із об’єктом FormData. Якимось чином IE ігнорує поле введення, коли воно знаходиться всередині елемента мітки, і в результаті дані файлу недоступні від об’єкта FormData.
Рене

385

Я здивований, що згадки про це не було <label> стихію .

Рішення:

<label class="btn btn-primary" for="my-file-selector">
    <input id="my-file-selector" type="file" class="d-none">
    Button Text Here
</label>

Не потрібно жодних JS чи фанк-файлів ...

Рішення щодо включення імені файлу:

<label class="btn btn-primary" for="my-file-selector">
    <input id="my-file-selector" type="file" style="display:none" 
    onchange="$('#upload-file-info').html(this.files[0].name)">
    Button Text Here
</label>
<span class='label label-info' id="upload-file-info"></span>

Наведене вище рішення вимагає jQuery.


38
Ця відповідь має бути прийнятою. Це навіть краще, ніж відповідь @ claviska
Фернандо Карвальоса

4
Не можу зрозуміти, чому це не прийнята відповідь. Чистий, простий та стабільний (якщо ви не орієнтуєтесь на <IE9, тобто ...)
Джейк Фостер

3
Я не міг змусити це працювати над IE11 разом із об’єктом FormData. Якимось чином IE ігнорує поле введення, коли воно знаходиться всередині елемента мітки, і в результаті дані файлу недоступні від об’єкта FormData.
Рене

25
ну, він не відображає, який файл обрано (
godblessstrawberry

3
Не потрібно використовувати, forякщо ви обмотуєте цільовий елемент міткою.
0xcaff

132

Без додаткового плагіну це завантажувальне рішення працює для мене чудово:

<div style="position:relative;">
        <a class='btn btn-primary' href='javascript:;'>
            Choose File...
            <input type="file" style='position:absolute;z-index:2;top:0;left:0;filter: alpha(opacity=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0;background-color:transparent;color:transparent;' name="file_source" size="40"  onchange='$("#upload-file-info").html($(this).val());'>
        </a>
        &nbsp;
        <span class='label label-info' id="upload-file-info"></span>
</div>

демонстрація:

http://jsfiddle.net/haisumbhatti/cAXFA/1/ (завантажувальна програма 2)

введіть тут опис зображення

http://jsfiddle.net/haisumbhatti/y3xyU/ (завантажувальна програма 3)

введіть тут опис зображення


6
У мене виникли проблеми з нижньою частиною кнопки, яку не можна було натискати. Ця відповідь допомогла мені у завантаженні 3: stackoverflow.com/a/18164555/44336
Пол Лемке

3
Це відмінне рішення, оскільки воно показує назву вкладеного файлу!
cb88

2
Чи могла б хтось пояснити необхідність href = 'javascript:;' ? Мені не потрібен onchange = '$ ("# upload-file-info"). Html ($ (this) .val ());' оновити елемент upload-file-info, але діалогове вікно завантаження файлу не запуститься без href.
користувач12121234

2
Звідки походить "C: \ fakepath" і як я можу його позбутися?
Я.

1
@Ya. C: \ fakepath є функцією захисту html5 і має префікс до шляху до файлу, якщо ми маніпулюємо ним за допомогою JavaScript. Докладніше дивіться у цій публікації щоденника davidwalsh.name/fakepath .
codefreak

88

Він включений у вилку Jasny для завантажувального пристрою.

Проста кнопка завантаження може бути створена за допомогою

<span class="btn btn-file">Upload<input type="file" /></span>

За допомогою додатка завантаження файлів ви можете створювати більш вдосконалені віджети. Погляньте на http://jasny.github.io/bootstrap/javascript/#fileinput


Це працює добре в IE9? Я запитую, тому що я припускаю, що рішення використовує Javascript, і, в той же час, "IE не дозволяє маніпулювати вхідним елементом type =" file "з JavaScript через причини безпеки".
Marek Příhoda

Так, він працює і в IE9. Він встановлює непрозорість вхідного елемента до 0, що, на щастя, працює у всіх браузерах :). Це пояснено в статті quirksmode.
Арнольд Даніельс

1
він не працює з JQuery 1.9.0, тому що вони впали $ .browser підтримку
Giedrius

14
Страшно виглядає при регулярному завантаженні - img688.imageshack.us/img688/948/pictureui.png
cwd

66

Кнопки для завантаження - це біль для стилю, оскільки вона стилює введення, а не кнопку.

але ви можете використовувати цю хитрість:

http://www.quirksmode.org/dom/inputfile.html

Підсумок:

  1. Візьміть звичайний <input type="file">і покладіть його в елемент з position: relative.

  2. До цього самого батьківського елемента додайте нормальне <input>та зображення, які мають правильні стилі. Розташовуйте ці елементи абсолютно так, щоб вони займали те саме місце, що і <input type="file">.

  3. Встановіть z-індекс <input type="file">до 2 так, щоб він лежав у верхній частині стильового вводу / зображення.

  4. Нарешті, встановіть непрозорість значення <input type="file">0. <input type="file">Тепер стає ефективно непомітним, і введення / зображення стилів просвічується, але ви все одно можете натиснути кнопку «Огляд». Якщо кнопка розміщена вгорі зображення, з'являється користувач, який натискає на зображення і отримує звичайне вікно вибору файлів. (Зверніть увагу, що ви не можете використовувати видимість: приховано, оскільки справді невидимий елемент теж не натискає, і нам потрібно залишатись натисканням)


6
Це занадто багато роботи в ці дні. Використання чогось готового, як рішення Ясні, у наступній відповіді має набагато більше сенсу.
mgPePe

2
Якщо ваш приклад включає підтримку підтримки netscape, він, ймовірно, не є сучасним.
Тифомізм

22

Для мене працює:

Оновлення

Стиль плагін jQuery :

// Based in: http://duckranger.com/2012/06/pretty-file-input-field-in-bootstrap/
// Version: 0.0.3
// Compatibility with: Bootstrap 3.2.0 and jQuery 2.1.1
// Use:
//     <input class="nice_file_field" type="file" data-label="Choose Document">
//     <script> $(".nice_file_field").niceFileField(); </script>
//
(function( $ ) {
  $.fn.niceFileField = function() {
    this.each(function(index, file_field) {
      file_field = $(file_field);
      var label = file_field.attr("data-label") || "Choose File";

      file_field.css({"display": "none"});

      nice_file_block_text  = '<div class="input-group nice_file_block">';
      nice_file_block_text += '  <input type="text" class="form-control">';
      nice_file_block_text += '  <span class="input-group-btn">';
      nice_file_block_text += '   <button class="btn btn-default nice_file_field_button" type="button">' + label + '</button>';
      nice_file_block_text += '  </span>';
      nice_file_block_text += '</div>';

      file_field.after(nice_file_block_text);

      var nice_file_field_button = file_field.parent().find(".nice_file_field_button");
      var nice_file_block_element = file_field.parent().find(".nice_file_block");

      nice_file_field_button.on("click", function(){ console.log("click"); file_field.click() } );
      file_field.change( function(){
        nice_file_block_element.find("input").val(file_field.val());
      });
    });
  };
})( jQuery );

17

Спрощена відповідь, використовуючи частини з інших відповідей, насамперед user2309766 та dotcomsuperstar.

Особливості:

  • Використовує доповнення кнопки Bootstrap для кнопки та поля.
  • Лише один вхід; декілька входів будуть зібрані формою.
  • Без додаткових css, крім "display: none;" щоб приховати вхід файлу.
  • Видима кнопка спрацьовує подія клацання для прихованого введення файлу.
  • split для видалення шляху до файлів використовуються регулярні вирази та роздільники '\' та '/'.

Код:

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="input-group">
  <span class="input-group-btn">
    <span class="btn btn-primary" onclick="$(this).parent().find('input[type=file]').click();">Browse</span>
    <input name="uploaded_file" onchange="$(this).parent().parent().find('.form-control').html($(this).val().split(/[\\|/]/).pop());" style="display: none;" type="file">
  </span>
  <span class="form-control"></span>
</div>


12

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

.input-file { position: relative; margin: 60px 60px 0 } /* Remove margin, it is just for stackoverflow viewing */
.input-file .input-group-addon { border: 0px; padding: 0px; }
.input-file .input-group-addon .btn { border-radius: 0 4px 4px 0 }
.input-file .input-group-addon input { cursor: pointer; position:absolute; width: 72px; z-index:2;top:0;right:0;filter: alpha(opacity=0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";opacity:0; background-color:transparent; color:transparent; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
<div class="input-group input-file">
  <div class="form-control">
    <a href="/path/to/your/current_file_name.pdf" target="_blank">current_file_name.pdf</a>
  </div>
  <span class="input-group-addon">
    <a class='btn btn-primary' href='javascript:;'>
      Browse
      <input type="file" name="field_name" onchange="$(this).parent().parent().parent().find('.form-control').html($(this).val());">
    </a>
  </span>
</div>


9

Це прекрасно працює для мене

<span>
    <input  type="file" 
            style="visibility:hidden; width: 1px;" 
            id='${multipartFilePath}' name='${multipartFilePath}'  
            onchange="$(this).parent().find('span').html($(this).val().replace('C:\\fakepath\\', ''))"  /> <!-- Chrome security returns 'C:\fakepath\'  -->
    <input class="btn btn-primary" type="button" value="Upload File.." onclick="$(this).parent().find('input[type=file]').click();"/> <!-- on button click fire the file click event -->
    &nbsp;
    <span  class="badge badge-important" ></span>
</span>

9

Перевірте введення файлів завантажувального файлу Twitter . Він використовує дуже просте рішення, просто додайте один файл JavaScript і вставте наступний код:

$('input[type=file]').bootstrapFileInput();

Посилання розірвано (липень 2019 року)
Yetti99

@ Yetti99 так, зараз це зламано
monsur.hoq

@ Yetti99, я змінив посилання. Перевірте зараз.
monsur.hoq

6

Просте рішення з прийнятним результатом:

<input type="file" class="form-control">

І стиль:

input[type=file].form-control {
    height: auto;
}

5

Рішення для багаторазового завантаження

Я підробив дві попередні відповіді, щоб включити кілька завантажень. Таким чином мітка показує ім'я файлу, якщо вибрано лише одне, або x filesв протилежному випадку.

<label class="btn btn-primary" for="my-file-selector">
    <input id="my-file-selector" type="file" multiple="multiple" style="display:none"
        onchange="$('#upload-file-info').html(
            (this.files.length > 1) ? this.files.length + ' files' : this.files[0].name)">                     
    Files&hellip;
</label>
<span class='label label-info' id="upload-file-info"></span>

введіть тут опис зображення

Це може також застосовуватися для зміни тексту кнопки та класу.

<label class="btn btn-primary" for="multfile">
    <input id="multfile" type="file" multiple="multiple" style="display:none"
        onchange="$('#multfile-label').html(
            (this.files.length == 1) ? this.files[0].name : this.files.length + ' files');
            $(this).parent().addClass('btn-success')">
    <span id="multfile-label">Files&hellip;</span>
</label>

введіть тут опис зображення


4

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

Сподіваюся, це допомагає !! :)

(Використовувана рамка Bootstrap)

Codepen-link

HTML

<center>
 <br />
 <br />
 <span class="head">Upload Button Re-Imagined</span>
 <br />
 <br />
 <div class="fileUpload blue-btn btn width100">
   <span>Upload your Organizations logo</span>
   <input type="file" class="uploadlogo" />
 </div>
</center>

CSS

 .head {
   font-size: 25px;
   font-weight: 200;
 }

 .blue-btn:hover,
 .blue-btn:active,
 .blue-btn:focus,
 .blue-btn {
   background: transparent;
   border: solid 1px #27a9e0;
   border-radius: 3px;
   color: #27a9e0;
   font-size: 16px;
   margin-bottom: 20px;
   outline: none !important;
   padding: 10px 20px;
 }

 .fileUpload {
   position: relative;
   overflow: hidden;
   height: 43px;
   margin-top: 0;
 }

 .fileUpload input.uploadlogo {
   position: absolute;
   top: 0;
   right: 0;
   margin: 0;
   padding: 0;
   font-size: 20px;
   cursor: pointer;
   opacity: 0;
   filter: alpha(opacity=0);
   width: 100%;
   height: 42px;
 }


 /*Chrome fix*/

 input::-webkit-file-upload-button {
   cursor: pointer !important;
 }

JS

// You can modify the upload files to pdf's, docs etc
//Currently it will upload only images
$(document).ready(function($) {

  // Upload btn
  $(".uploadlogo").change(function() {
    readURL(this);
  });

  function readURL(input) {
    var url = input.value;
    var ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase();
    if (input.files && input.files[0] && (ext == "png" || ext == "jpeg" || ext == "jpg" || ext == "gif" || ext == "svg")) {
      var path = $('.uploadlogo').val();
      var filename = path.replace(/^.*\\/, "");
      $('.fileUpload span').html('Uploaded logo : ' + filename);
      // console.log(filename);
    } else {
      $(".uploadlogo").val("");
      $('.fileUpload span').html('Only Images Are Allowed!');
    }
  }
});

4

це найкращий стиль завантаження файлів, який мені подобається:

<div class="fileupload fileupload-new" data-provides="fileupload">
  <div class="input-append">
    <div class="uneditable-input span3"><i class="icon-file fileupload-exists"></i> <span class="fileupload-preview"></span></div><span class="btn btn-file"><span class="fileupload-new">Select file</span><span class="fileupload-exists">Change</span><input type="file" /></span><a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
  </div>
</div>

ви можете отримати демонстраційну версію та інші стилі на:

http://www.jasny.net/bootstrap/javascript/#fileinput

але використовуючи це, вам слід замінити завантажувальний твіттер на ясні файли завантаження ..

з повагою


4

На основі абсолютно геніального рішення @claviska, кому належить вся заслуга.

Повнофункціональне введення файлів Bootstrap 4 з валідацією та текстом довідки.

На основі прикладу групи введення у нас є фіктивне текстове поле введення, яке використовується для відображення імені файлу користувачеві, яке заповнюється від onchangeподії у фактичному полі вхідного файлу, прихованому за кнопкою мітки. Крім включення перевірки завантажувальної програми 4 підтримки для ми також дали можливість натиснути будь-де на вході, щоб відкрити діалогове вікно файлу.

Три стану введення файлу

Три можливі стани є неперевіреними, дійсними та недійсними з requiredнабором атрибутів вхідного тегу манекена html .

введіть тут опис зображення

Розмітка Html для введення

Ми запроваджуємо лише 2 спеціальні класи input-file-dummyта input-file-btnналежним чином стилюємо та визначаємо бажану поведінку. Все інше - це стандартна розмітка Bootstrap 4.

<div class="input-group">
  <input type="text" class="form-control input-file-dummy" placeholder="Choose file" aria-describedby="fileHelp" required>
  <div class="valid-feedback order-last">File is valid</div>
  <div class="invalid-feedback order-last">File is required</div>
  <label class="input-group-append mb-0">
    <span class="btn btn-primary input-file-btn">
      Browse… <input type="file" hidden>
    </span>
  </label>
</div>
<small id="fileHelp" class="form-text text-muted">Choose any file you like</small>

Положення щодо поведінки в JavaScript

Макетний вхід потрібно читати лише згідно з оригінальним прикладом, щоб запобігти користувачеві змінити вхід, який може бути змінений лише через діалогове вікно відкритого файлу. На жаль, перевірка не відбувається на readonlyполях, тому ми перемикаємо редагованість вводу на фокус і розмиття ( події jquery onfocusin таonfocusout ) та гарантуємо, що він знову стане перевіреним після вибору файлу.

Окрім того, щоб зробити текстове поле натисканням, натисканням події натискання кнопки, решта функціональних можливостей заповнення поля манекена передбачала @claviska.

$(function () {
  $('.input-file-dummy').each(function () {
    $($(this).parent().find('.input-file-btn input')).on('change', {dummy: this}, function(ev) {
      $(ev.data.dummy)
        .val($(this).val().replace(/\\/g, '/').replace(/.*\//, ''))
        .trigger('focusout');
    });
    $(this).on('focusin', function () {
        $(this).attr('readonly', '');
      }).on('focusout', function () {
        $(this).removeAttr('readonly');
      }).on('click', function () {
        $(this).parent().find('.input-file-btn').click();
      });
  });
});

Налаштування стилю на замовлення

Найголовніше, що ми не хочемо, щоб readonlyполе переходило між сірим фоном і білим, тому ми гарантуємо, що воно залишається білим. Кнопка "span" не має курсору вказівника, але нам все одно потрібно додати його для введення.

.input-file-dummy, .input-file-btn {
  cursor: pointer;
}
.input-file-dummy[readonly] {
  background-color: white;
}

nJoy!



2

/ * * Файл Bootstrap 3 * http://dev.tudosobreweb.com.br/bootstrap-filestyle/ * * Авторське право (c) 2013 Markus Vinicius da Silva Lima * Оновити завантажувальний 3 3 Пауло Анріке Фоксер * Версія 2.0.0 * Ліцензований за ліцензією MIT. * * /

(function ($) {
"use strict";

var Filestyle = function (element, options) {
    this.options = options;
    this.$elementFilestyle = [];
    this.$element = $(element);
};

Filestyle.prototype = {
    clear: function () {
        this.$element.val('');
        this.$elementFilestyle.find(':text').val('');
    },

    destroy: function () {
        this.$element
            .removeAttr('style')
            .removeData('filestyle')
            .val('');
        this.$elementFilestyle.remove();
    },

    icon: function (value) {
        if (value === true) {
            if (!this.options.icon) {
                this.options.icon = true;
                this.$elementFilestyle.find('label').prepend(this.htmlIcon());
            }
        } else if (value === false) {
            if (this.options.icon) {
                this.options.icon = false;
                this.$elementFilestyle.find('i').remove();
            }
        } else {
            return this.options.icon;
        }
    },

    input: function (value) {
        if (value === true) {
            if (!this.options.input) {
                this.options.input = true;
                this.$elementFilestyle.prepend(this.htmlInput());

                var content = '',
                    files = [];
                if (this.$element[0].files === undefined) {
                    files[0] = {'name': this.$element[0].value};
                } else {
                    files = this.$element[0].files;
                }

                for (var i = 0; i < files.length; i++) {
                    content += files[i].name.split("\\").pop() + ', ';
                }
                if (content !== '') {
                    this.$elementFilestyle.find(':text').val(content.replace(/\, $/g, ''));
                }
            }
        } else if (value === false) {
            if (this.options.input) {
                this.options.input = false;
                this.$elementFilestyle.find(':text').remove();
            }
        } else {
            return this.options.input;
        }
    },

    buttonText: function (value) {
        if (value !== undefined) {
            this.options.buttonText = value;
            this.$elementFilestyle.find('label span').html(this.options.buttonText);
        } else {
            return this.options.buttonText;
        }
    },

    classButton: function (value) {
        if (value !== undefined) {
            this.options.classButton = value;
            this.$elementFilestyle.find('label').attr({'class': this.options.classButton});
            if (this.options.classButton.search(/btn-inverse|btn-primary|btn-danger|btn-warning|btn-success/i) !== -1) {
                this.$elementFilestyle.find('label i').addClass('icon-white');
            } else {
                this.$elementFilestyle.find('label i').removeClass('icon-white');
            }
        } else {
            return this.options.classButton;
        }
    },

    classIcon: function (value) {
        if (value !== undefined) {
            this.options.classIcon = value;
            if (this.options.classButton.search(/btn-inverse|btn-primary|btn-danger|btn-warning|btn-success/i) !== -1) {
                this.$elementFilestyle.find('label').find('i').attr({'class': 'icon-white '+this.options.classIcon});
            } else {
                this.$elementFilestyle.find('label').find('i').attr({'class': this.options.classIcon});
            }
        } else {
            return this.options.classIcon;
        }
    },

    classInput: function (value) {
        if (value !== undefined) {
            this.options.classInput = value;
            this.$elementFilestyle.find(':text').addClass(this.options.classInput);
        } else {
            return this.options.classInput;
        }
    },

    htmlIcon: function () {
        if (this.options.icon) {
            var colorIcon = '';
            if (this.options.classButton.search(/btn-inverse|btn-primary|btn-danger|btn-warning|btn-success/i) !== -1) {
                colorIcon = ' icon-white ';
            }

            return '<i class="'+colorIcon+this.options.classIcon+'"></i> ';
        } else {
            return '';
        }
    },

    htmlInput: function () {
        if (this.options.input) {
            return '<input type="text" class="'+this.options.classInput+'" style="width: '+this.options.inputWidthPorcent+'% !important;display: inline !important;" disabled> ';
        } else {
            return '';
        }
    },

    constructor: function () {
        var _self = this,
            html = '',
            id = this.$element.attr('id'),
            files = [];

        if (id === '' || !id) {
            id = 'filestyle-'+$('.bootstrap-filestyle').length;
            this.$element.attr({'id': id});
        }

        html = this.htmlInput()+
             '<label for="'+id+'" class="'+this.options.classButton+'">'+
                this.htmlIcon()+
                '<span>'+this.options.buttonText+'</span>'+
             '</label>';

        this.$elementFilestyle = $('<div class="bootstrap-filestyle" style="display: inline;">'+html+'</div>');

        var $label = this.$elementFilestyle.find('label');
        var $labelFocusableContainer = $label.parent();

        $labelFocusableContainer
            .attr('tabindex', "0")
            .keypress(function(e) {
                if (e.keyCode === 13 || e.charCode === 32) {
                    $label.click();
                }
            });

        // hidding input file and add filestyle
        this.$element
            .css({'position':'absolute','left':'-9999px'})
            .attr('tabindex', "-1")
            .after(this.$elementFilestyle);

        // Getting input file value
        this.$element.change(function () {
            var content = '';
            if (this.files === undefined) {
                files[0] = {'name': this.value};
            } else {
                files = this.files;
            }

            for (var i = 0; i < files.length; i++) {
                content += files[i].name.split("\\").pop() + ', ';
            }

            if (content !== '') {
                _self.$elementFilestyle.find(':text').val(content.replace(/\, $/g, ''));
            }
        });

        // Check if browser is Firefox
        if (window.navigator.userAgent.search(/firefox/i) > -1) {
            // Simulating choose file for firefox
            this.$elementFilestyle.find('label').click(function () {
                _self.$element.click();
                return false;
            });
        }
    }
};

var old = $.fn.filestyle;

$.fn.filestyle = function (option, value) {
    var get = '',
        element = this.each(function () {
            if ($(this).attr('type') === 'file') {
                var $this = $(this),
                    data = $this.data('filestyle'),
                    options = $.extend({}, $.fn.filestyle.defaults, option, typeof option === 'object' && option);

                if (!data) {
                    $this.data('filestyle', (data = new Filestyle(this, options)));
                    data.constructor();
                }

                if (typeof option === 'string') {
                    get = data[option](value);
                }
            }
        });

    if (typeof get !== undefined) {
        return get;
    } else {
        return element;
    }
};

$.fn.filestyle.defaults = {
    'buttonText': 'Escolher arquivo',
    'input': true,
    'icon': true,
    'inputWidthPorcent': 65,
    'classButton': 'btn btn-primary',
    'classInput': 'form-control file-input-button',
    'classIcon': 'icon-folder-open'
};

$.fn.filestyle.noConflict = function () {
    $.fn.filestyle = old;
    return this;
};

// Data attributes register
$('.filestyle').each(function () {
    var $this = $(this),
        options = {
            'buttonText': $this.attr('data-buttonText'),
            'input': $this.attr('data-input') === 'false' ? false : true,
            'icon': $this.attr('data-icon') === 'false' ? false : true,
            'classButton': $this.attr('data-classButton'),
            'classInput': $this.attr('data-classInput'),
            'classIcon': $this.attr('data-classIcon')
        };

    $this.filestyle(options);
});
})(window.jQuery);

2

Я змінив @claviska відповідь і працює як мені подобається (Bootstrap 3, 4 не перевірено):

<label class="btn btn-default">
    <span>Browse</span>
    <input type="file" style="display: none;" onchange="$(this).prev('span').text($(this).val()!=''?$(this).val():'Browse')">
</label>

2

введіть тут опис зображення

У наведеному нижче коді робиться як на малюнку

Html

<form>
<div class="row">
<div class="col-lg-6">
<label for="file">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default" type="button">Browse</button>
</span>
<input type="text" class="form-control" id="info" readonly="" style="background: #fff;" placeholder="Search for...">
</div><!-- /input-group -->
</label>
</div><!-- /.col-lg-6 -->
</div>

</div>
<input type="file" style="display: none;" onchange="$('#info').val($(this).val().split(/[\\|/]/).pop()); " name="file" id="file">
</form>

Javascript

<script type="text/javascript">

$(function() {
    $("label[for=file]").click(function(event) {
        event.preventDefault();
        $("#file").click();
    });
});

</script>

1

У мене така ж проблема, і я пробую її так.

<div>
<button type='button' class='btn btn-info btn-file'>Browse</button>
<input type='file' name='image'/>
</div>

CSS

<style>
.btn-file {
    position:absolute;
}
</style>

JS

<script>
$(document).ready(function(){
    $('.btn-file').click(function(){
        $('input[name="image"]').click();
    });
});
</script>

Примітка. Кнопка .btn-файл має містити теги, що і вхідний файл

Сподіваюся, ви знайшли найкраще рішення ...


1

Спробуйте слідувати у Bootstrap v.3.3.4

<div>
    <input id="uplFile" type="file" style="display: none;">

    <div class="input-group" style="width: 300px;">
        <div  id="btnBrowse"  class="btn btn-default input-group-addon">Select a file...</div>
        <span id="photoCover" class="form-control">
    </div>
</div>

<script type="text/javascript">
    $('#uplFile').change(function() {
        $('#photoCover').text($(this).val());
    });

    $('#btnBrowse').click(function(){
        $('#uplFile').click();
    });
</script>

1

Ось альтернативний трюк, це не найкраще рішення, але він просто дає вам вибір

HTML-код:

<button clss="btn btn-primary" id="btn_upload">Choose File</button>
<input id="fileupload" class="hide" type="file" name="files[]">

Javascript:

$("#btn_upload").click(function(e){
e.preventDefault();
$("#fileupload").trigger('click');
});

1

Щодо відповіді клавіски - якщо ви хочете показати завантажене ім’я файлу в основному файлі для завантаження, ви можете зробити це у onchangeподії введення даних . Просто використовуйте цей код:

 <label class="btn btn-default">
                    Browse...
                    <span id="uploaded-file-name" style="font-style: italic"></span>
                    <input id="file-upload" type="file" name="file"
                           onchange="$('#uploaded-file-name').text($('#file-upload')[0].value);" hidden>
 </label>

Цей JQery JS-код відповідає за отримання завантаженого імені файлу:

$('#file-upload')[0].value

Або з ванільним JS:

document.getElementById("file-upload").value

приклад


1

Я подумав, що я додам вашій вартості три копійки, просто щоб сказати, як вводити файл за замовчуванням .custom-file-labelі custom-file-inputBS4 файл і як це можна використовувати.

Останній клас знаходиться у групі введення і його не видно. У той час як перший - це видима мітка і має: після псевдоелемента, схожого на кнопку.

<div class="custom-file">
<input type="file" class="custom-file-input" id="upload">
<label class="custom-file-label" for="upload">Choose file</label>
</div>

Ви не можете додавати класи до psuedoelements, але ви можете стилізувати їх у CSS (або SASS).

.custom-file-label:after {
    color: #fff;
    background-color: #1e7e34;
    border-color: #1c7430;
    pointer: cursor;
}

0

Не потрібно фантазійних шизів:

HTML:

<form method="post" action="/api/admin/image" enctype="multipart/form-data">
    <input type="hidden" name="url" value="<%= boxes[i].url %>" />
    <input class="image-file-chosen" type="text" />
    <br />
    <input class="btn image-file-button" value="Choose Image" />
    <input class="image-file hide" type="file" name="image"/> <!-- Hidden -->
    <br />
    <br />
    <input class="btn" type="submit" name="image" value="Upload" />
    <br />
</form>

JS:

$('.image-file-button').each(function() {
      $(this).off('click').on('click', function() {
           $(this).siblings('.image-file').trigger('click');
      });
});
$('.image-file').each(function() {
      $(this).change(function () {
           $(this).siblings('.image-file-chosen').val(this.files[0].name);
      });
});

ПОПЕРЕДЖЕННЯ. Три елемента, про які йдеться, ОБОВ'ЯЗКОВО бути побратимами один одного (вибраний файл .image-файл, .image-file-button, .image-file)


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