Как изменить текст кнопки <input type = «file» />?

257
<input type="file" value="Browse" name="avatar" id="id_avatar" />

Я пытался изменить value, но это не работает. Как настроить текст кнопки?

user198729
источник
Вы говорите о имени файла или тексте кнопки?
Артелиус
Возможный дубликат Как переименовать HTML кнопку «Обзор»?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

153

Используйте Bootstrap FileStyle , который используется для стилизации файловых полей форм. Это плагин для библиотеки компонентов на основе jQuery под названием Twitter Bootstrap

Пример использования:

Включают:

<script type="text/javascript" src="js/bootstrap-filestyle.min.js"> </script>

С помощью JavaScript:

$(":file").filestyle();

Через атрибуты данных:

<input type="file" class="filestyle" data-classButton="btn btn-primary" data-input="false" data-classIcon="icon-plus" data-buttonText="Your label here.">
Фернандо Кош
источник
Кажется, не работает для меня. Он по-прежнему показывает кнопки по умолчанию brorser. Кроме того, демонстрация на github.com/markusslima/bootstrap-filestyle.git также не работает - все примеры показывают кнопки по умолчанию. Я что-то упускаю?
Я.
7
@ Тони Э-э-э ... с чего вы взяли, что Bootstrap также не использует "дурацкий <img /> хак"? :-)
Andz
@Я можешь сказать, какой браузер и какая у него версия? Протестировано сейчас на Chrome версии 43.0.2357.130 (64-битная версия) в Linux, и все примеры работают отлично.
Фернандо Кош
20
Бросить библиотеку javascript (с плагином!) На такую ​​маленькую проблему - это не изящное излишество.
MKaama
3
Downvoted. Это даже не ответ, а обходной путь, который требует дополнительной библиотеки. Ответ должен изменить поведение рендеринга для браузеров.
wdetac
108

Вместо этого вы можете поместить изображение и сделать это так:

HTML:

<img src="/images/uploadButton.png" id="upfile1" style="cursor:pointer" />
<input type="file" id="file1"  name="file1" style="display:none" />

JQuery:

$("#upfile1").click(function () {
    $("#file1").trigger('click');
});

ПРЕДУПРЕЖДЕНИЕ . В IE9 и IE10, если вы запускаете onClick в файле, вводимом через javascript, форма будет помечена как «опасная» и не может быть отправлена ​​с помощью javascript, не будучи уверенным, что она может быть отправлена ​​традиционно.

Парпар
источник
5
Это умное решение. Не могли бы вы также сделать это с помощью элемента <button>?
Код командира
1
@Code Commander -Спасибо, и да, вы можете сделать это с любым элементом, который вы хотите, но наиболее распространенным является элемент <image>. Просто избавьтесь от кнопки + текстовое поле от «ввода файла» ...
ParPar
2
Просто на голову любому, кто использует вышеизложенное, некоторые мобильные браузеры отключают программный запуск кликов при вводе файлов. Конкретно андроид 4 для Galaxy S III
новенькие
Я использую <input type="file" внутри строки gridview asp.net, чьи строки могут быть добавлены динамически ... так что будет очень больно в голове вызывать соответствующий триггер щелчка ввода (той же строки) при нажатии на изображение! : /
Сохаибы
Ваше решение не работает. Вы не задали границы, поля, отступы и цвет фона, иначе это было бы очевидно
yan bellavance
88

Скрыть файл ввода. Создайте новый вход для захвата события щелчка и перешлите его на скрытый вход:

<input type="button" id="loadFileXml" value="loadXml" onclick="document.getElementById('file').click();" />
<input type="file" style="display:none;" id="file" name="file"/>
MushyPeas
источник
бросая в HTA файл с режимом ie7, мне пришлось удалить ;в конце.
ATek
отлично, не хочу включать начальную загрузку только для того, чтобы изменить два слова текста, но как бы вы это сделали, если ввод файла был создан динамически?
аспаризм
@asparism использует JavaScript для управления DOM, скрывает его, устанавливая его стиль и использует before () и добавляет новый элемент ввода?
MushyPeas
3
@MushyPeas это самый простой способ. пытался поиграть с css но это решение намного быстрее и проще. спасибо
Мара
2
Это был самый простой способ для меня тоже! Это также позволило мне стилизовать кнопку-макет файла как один из набора других параметров кнопки-формы, не беспокоясь о отображении странно выглядящей кнопки-файла «Обзор».
Гарри Мантеакис,
47

Текст «загрузить файл ...» предварительно определен браузером и не может быть изменен. Единственный способ обойти это - использовать компонент загрузки на основе Flash или Java, такой как swfupload .

Пекка
источник
3
Можете ли вы доказать, что это нельзя изменить?
user198729
Или просматривая исходные коды браузеров, по крайней мере, для открытых.
Пекка
Это может быть ответом (на другой вопрос, что-то вроде «Почему содержимое значения», VALUE = «C: \ someFile.txt») для поля ввода файла типа «TYPE =« FILE »», игнорируется браузер? "): stackoverflow.com/questions/1342039
Питер Мортенсен
23

Отлично работает на всех браузерах. Надеюсь, это будет работать и для вас.

HTML:
<input type="file" class="custom-file-input">

CSS:

 .custom-file-input::-webkit-file-upload-button {
  visibility: hidden;
}
.custom-file-input::before {
  content: 'Select some files';
  display: inline-block;
  background: -webkit-linear-gradient(top, #f9f9f9, #e3e3e3);
  border: 1px solid #999;
  border-radius: 3px;
  padding: 5px 8px;
  outline: none;
  white-space: nowrap;
  -webkit-user-select: none;
  cursor: pointer;
  text-shadow: 1px 1px #fff;
  font-weight: 700;
  font-size: 10pt;
}
.custom-file-input:hover::before {
  border-color: black;
}
.custom-file-input:active::before {
  background: -webkit-linear-gradient(top, #e3e3e3, #f9f9f9);
}

Изменить content: 'Select some files';с текстом, который вы хотите внутри''

ЕСЛИ НЕ РАБОТАЕТ С Firefox, тогда используйте это вместо ввода:

<label class="custom-file-input" for="Upload" >
</label>

<input id="Upload" type="file" multiple="multiple" name="_photos" accept="image/*" style="visibility: hidden">
Код Черный
источник
Работает на Safari, хотя
Cullub
На моем FF 41.0.2 он отлично работает. Вы работаете, чтобы решить проблему совместимости браузера, пожалуйста, обратитесь к CSS BOX MODEL, чтобы минимизировать проблему.
Код черный
1
Проблема, вероятно, в том, что FF построен на Gecko, а не на webkit. (мое лучшее предположение)
Cullub
2
<label id = "addButton" for = "Загрузить" style = "background-color: # 000; color: #fff; отступ: 4px; border-radius: 4px; font-family: monospace;" > Выберите какой-нибудь файл </ label> <input id = "Upload" type = "file" множественный = "множественный" name = "_ photos" accept = "image / *" style = "visibility: hidden">
код черный
4
Хорошо, спасибо! Проверьте это JSFiddle . Если вы отредактируете свой ответ этим, я думаю, что это достойно воззвания :)
Cullub
10

это плагин JQuery для изменения текста кнопки элемента входного файла.

Пример HTML:

<input type="file" id="choose-file" />

Пример JS:

$('#choose-file').inputFileText({
    text: 'Select File'
});

Результат:

результат плагина

datchung
источник
9

Просто

<label class="btn btn-primary">
  <i class="fa fa-image"></i> Your text here<input type="file" style="display: none;"  name="image">
</label>

[Изменить с помощью фрагмента]

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
<link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/>

<label class="btn btn-primary">
<i class="fa fa-image"></i> Your text here<input type="file" style="display: none;" name="image">
</label>

Кен Карло
источник
Попробуйте посмотреть, что я сделал здесь jsfiddle.net
Кен Карло
Спасибо, именно то, что я хотел :)
Гарт Бейкер
7

Я думаю, что это то, что вы хотите:

<button style="display:block;width:120px; height:30px;" onclick="document.getElementById('getFile').click()">Your text here</button>


<input type='file' id="getFile" style="display:none"> 
крошка
источник
3

РЕДАКТИРОВАТЬ : я вижу теперь по комментариям, которые вы спрашиваете о тексте кнопки, а не путь к файлу. Виноват. Я оставлю свой первоначальный ответ ниже на тот случай, если кто-то, кто наткнется на этот вопрос, интерпретирует его так, как я это сделал изначально.

2-е РЕДАКТИРОВАНИЕ : я удалил этот ответ, потому что я решил, что я неправильно понял вопрос, и мой ответ не имеет отношения. Тем не менее, комментарии в другом ответе указали, что люди все еще хотели видеть этот ответ, поэтому я его удаляю.

МОЙ ОРИГИНАЛЬНЫЙ ОТВЕТ (я думал, что ОП спрашивает о пути, а не о кнопке):

Это не поддерживается в целях безопасности . Веб-браузер Opera раньше поддерживал это, но он был удален. Подумайте, что было бы возможно, если бы это было поддержано; Вы можете создать страницу с вводом для загрузки файла, предварительно заполнив ее путем к некоторому конфиденциальному файлу, а затем автоматически отправить форму, используя JavaScript, вызванный onloadсобытием. Это может произойти слишком быстро для пользователя, чтобы что-то с этим сделать.

Асаф
источник
3

Использовать <label>для подписи

<form enctype='multipart/form-data' action='/uploads.php' method=post>
<label for=b1>
    <u>Your</u> caption here
<input style='width:0px' type=file name=upfile id=b1
 onchange='optionalExtraProcessing(b1.files[0])'
 accept='image/png'>
</label>
</form>

Это работает без какого-либо JavaScript . Вы можете украсить этикетку в любой степени сложности, к вашему сердцу. Когда вы нажимаете на ярлык, щелчок автоматически перенаправляется на вход файла. Сам вход файла может быть сделан невидимым любым методом. Если вы хотите, чтобы метка выглядела как кнопка, есть много решений, например:

label u {
    -webkit-appearance: button;
    -moz-appearance: button;
    appearance: button;

    text-decoration: none;
    color: initial;
}
MKaama
источник
2

Только CSS и класс начальной загрузки

        <div class="col-md-4 input-group">
            <input class="form-control" type="text"/>
            <div class="input-group-btn">
                <label for="files" class="btn btn-default">browse</label>
                <input id="files" type="file" class="btn btn-default"  style="visibility:hidden;"/>
            </div>
        </div>
Махмуд Каби
источник
1
  1. Перед этим <input type="file">добавьте изображение и <input style="position:absolute">оно будет занимать пространство<input type="file">
  2. Используйте следующий CSS для элемента file

    position:relative;  
    opacity:0;  
    z-index:99;
Bibaswann Bandyopadhyay
источник
0

Если вы используете рельсы и у вас возникли проблемы с их применением, я бы хотел добавить несколько советов из оригинального ответа @Fernando Kosh

  • Скачайте файл zip и скопируйте файл bootstrap-filestyle.min.js в папку app / assets / javascripts /
  • откройте файл application.js и добавьте эту строку ниже

    // = требуется bootstrap-filestyle.min

  • открой свой кофе и добавь эту строку

    $ (": file"). filestyle ({buttonName: "btn-primary", buttonBefore: true, buttonText: "Ваш текст здесь", icon: false});

widjajayd
источник
0

Вы можете просто добавить некоторые трюки CSS. Вам не нужен JavaScript или несколько входных файлов, и я сохраняю существующий атрибут значения . вам нужно добавить только CSS . Вы можете попробовать это решение.

.btn-file-upload{
     width: 187px;
     position:relative;
 }

.btn-file-upload:after{
    content:  attr(value);
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;    
    width: 48%;
    background: #795548;
    color: white;
    border-radius: 2px;
    text-align: center;
    font-size: 12px;
    line-height: 2;
 }
<input type="file" class="btn-file-upload" value="Uploadfile" />

Удара Касун
источник
0

Вот способ «изменить» текст ввода с типом файла, с чистым HTML и javascript:

<input id='browse' type='file' style='width:0px'>
<button id='browser' onclick='browse.click()'>
    *The text you want*
</button>
IntelarX
источник
0

для меня это не работает пользовательский текст с bootstrap-filestyle . Это помогает с оформлением кнопок, но текст его странно изменить, прежде чем заняться борьбой с CSS, я попробую следующее:

$( document ).ready(function() {
   $('.buttonText').html('Seleccione ficheros');
});

bootstrap-filestyle отображает компонент в виде span с классом butonText, поэтому при загрузке документа просто измените текст. легко и правильно, и он должен работать во всех браузерах.

ура

Борис Ч.Ф.
источник
0

Я сделал это так для моего проекта:

.btn-outlined.btn-primary {
  color: #000;
}
.btn-outlined.btn-primary:active, .btn-outlined.btn-positive:active, .btn-outlined.btn-negative:active {
  color:#000;
}
.btn-block {
  display: block;
  width: 100%;
  padding: 15px 0;
  margin-bottom: 10px;
  font-size: 18px;
  font-family: Arial, Helvetica, sans-serif;
  text-align: center;
}
<label for="fileUpload" class="btn btn-primary btn-block btn-outlined">Your text</label>
<input type="file" id="fileUpload"style="display: none;">

Khapi
источник
-1

Это альтернативное решение, которое может вам помочь. Это скрывает текст, который появляется вне кнопки, смешивая его с цветом фона div. Затем вы можете дать div название, которое вам нравится.

<div style="padding:10px;font-weight:bolder; background-color:#446655;color: white;margin-top:10px;width:112px;overflow: hidden;">
     UPLOAD IMAGE <input style="width:100px;color:#446655;display: inline;" type="file"  />
</div>
jarimos
источник
В Chrome 39 я вижу текст ЗАГРУЗИТЬ ИЗОБРАЖЕНИЕ и кнопку <input>. Возможно, обработка Chrome файловых вводов изменилась с тех пор, как вы опубликовали это?
EricP
@ ян-беллаванс, что ты делаешь? Если вы считаете, что ответ неправильный или бесполезный, понизьте голос, но ни в коем случае не портите его!
Кайидо