Comment changer le texte du bouton de <input type = "file" />?

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

J'ai essayé de modifier le value, mais cela ne fonctionne pas. Comment personnaliser le texte du bouton?

user198729
la source
Parlez-vous du nom de fichier ou du texte du bouton?
Artelius
doublon possible de Comment renommer le bouton HTML "Parcourir"?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

153

Utilisez Bootstrap FileStyle , qui est utilisé pour styliser les champs de fichier des formulaires. Il s'agit d'un plugin pour une bibliothèque de composants basée sur jQuery appelée Twitter Bootstrap

Exemple d'utilisation:

Comprendre:

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

Via JavaScript:

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

Via les attributs de données:

<input type="file" class="filestyle" data-classButton="btn btn-primary" data-input="false" data-classIcon="icon-plus" data-buttonText="Your label here.">
Fernando Kosh
la source
Ne semble pas fonctionner pour moi. Il montre toujours les boutons par défaut du brorser. De plus, la démo sur github.com/markusslima/bootstrap-filestyle.git ne fonctionne pas non plus - tous les exemples montrent les boutons par défaut. Suis-je en train de manquer quelque chose?
Ouais.
7
@Tony Uhh .... qu'est-ce qui vous fait penser que Bootstrap n'utilise pas non plus le "hack farfelu <img />" en dessous? :-)
Andz
@Ya pouvez-vous dire quel navigateur et quelle version? Testé maintenant sur Chrome Version 43.0.2357.130 (64 bits) sur Linux et tous les exemples fonctionnent parfaitement.
Fernando Kosh
20
Lancer une bibliothèque javascript (avec un plugin!) Sur un si petit problème est une exagération inélégante.
MKaama
3
Voté. Ce n'est même pas une réponse, seulement une solution de contournement qui nécessite une bibliothèque supplémentaire. La réponse devrait viser à modifier le comportement de rendu des navigateurs.
wdetac
108

Vous pouvez mettre une image à la place et le faire comme ceci:

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

CAVEAT : Dans IE9 et IE10 si vous déclenchez le onClick dans une entrée de fichier via javascript, le formulaire sera marqué comme «dangereux» et ne pourra pas être envoyé avec javascript, vous ne savez pas s'il peut être soumis de manière traditionnelle.

ParPar
la source
5
Ceci est une solution intelligente. Ne pourriez-vous pas également faire cela avec un élément <button>?
Code Commander
1
@Code Commander -Merci, et oui, vous pouvez le faire avec tous les éléments que vous voulez, mais le plus courant est l'élément <image>. Débarrassez-vous simplement du bouton + champ de texte de la "saisie de fichier" ...
ParPar
2
Juste pour prévenir quiconque utilise ce qui précède, certains navigateurs mobiles désactivent le déclenchement des clics d'entrée de fichier par programme. Plus précisément, Android 4 pour le Galaxy S III
newshorts
J'utilise à l' <input type="file" intérieur de la ligne gridview asp.net, dont les lignes peuvent être ajoutées dynamiquement .. il sera donc très difficile d'appeler le déclencheur de clic d'entrée correspondant (de la même ligne) tout en cliquant sur une image! : /
sohaiby
votre solution ne fonctionne pas. Vous n'avez pas défini la bordure, la marge, le rembourrage et la couleur d'arrière-plan ou bien ce serait évident
yan bellavance
88

Masquez l'entrée du fichier. Créez une nouvelle entrée pour capturer un événement de clic et transférez-le à l'entrée cachée:

<input type="button" id="loadFileXml" value="loadXml" onclick="document.getElementById('file').click();" />
<input type="file" style="display:none;" id="file" name="file"/>
Purée de pois
la source
jetant dans un fichier HTA avec le mode ie7 j'ai dû supprimer le ;à la fin.
ATek
génial, vous ne voulez pas inclure bootstrap juste pour changer deux mots de texte, mais comment feriez-vous si l'entrée de fichier était créée dynamiquement?
asparisme
@asparism utilise JavaScript pour manipuler le DOM, le cacher en définissant son style et l'utiliser avant () et ajouter le nouvel élément d'entrée?
MushyPeas
3
@MushyPeas c'est le moyen le plus simple. essayé de jouer avec css mais cette solution est beaucoup plus rapide et plus facile. merci
Mara
2
C'était aussi le moyen le plus simple pour moi! Cela m'a également permis de STYLE le bouton de fichier "maquette" comme l'une des autres options de bouton de formulaire - sans avoir à se soucier d'afficher le bouton de fichier "Parcourir".
Harry Mantheakis du
47

Le texte "upload file ..." est prédéfini par le navigateur et ne peut pas être modifié. La seule façon de contourner ce problème est d'utiliser un composant de téléchargement basé sur Flash ou Java comme swfupload .

Pekka
la source
3
Pouvez-vous prouver qu'il ne peut pas être changé?
user198729
Ou en parcourant les codes sources des navigateurs, au moins pour ceux Open Source.
Pekka
Cela pourrait être par la réponse (à une autre question, quelque chose comme "Pourquoi le contenu de la valeur, 'VALUE =" C: \ someFile.txt "' pour un champ de saisie de type fichier, 'TYPE =" FILE "', ignoré par le navigateur? "): stackoverflow.com/questions/1342039
Peter Mortensen
23

Fonctionne parfaitement sur tous les navigateurs J'espère que cela fonctionnera aussi pour vous.

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

Changez content: 'Select some files';avec le texte que vous voulez à l'intérieur''

SI NE FONCTIONNE PAS AVEC firefox, utilisez ceci au lieu de saisir:

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

<input id="Upload" type="file" multiple="multiple" name="_photos" accept="image/*" style="visibility: hidden">
Code Black
la source
Fonctionne sur Safari, cependant
Cullub
Cela fonctionne parfaitement de mon côté sur mon FF 41.0.2.
Code Black
1
Le problème est probablement que FF est construit sur Gecko, pas sur webkit. (ma meilleure estimation)
Cullub
2
<label id = "addButton" for = "Upload" style = "background-color: # 000; color: #fff; padding: 4px; border-radius: 4px; font-family: monospace;" > Choisissez un fichier </label> <input id = "Upload" type = "file" multiple = "multiple" name = "_ photos" accept = "image / *" style = "visibilité: caché">
Code Black
4
OK merci! Découvrez ce JSFiddle . Si vous modifiez votre réponse avec cela, je pense que cela mérite une upvote :)
Cullub
10

Il s'agit d'un plugin JQuery pour modifier le texte du bouton d'un élément de fichier d'entrée.

Exemple HTML:

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

Exemple JS:

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

Résultat:

résultat du plugin

datchung
la source
9

Simplement

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

[Modifier avec l'extrait]

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

Ken Karlo
la source
Essayez de voir ce que j'ai fait ici jsfiddle.net
Ken Karlo
Merci, exactement ce que je voulais :)
Garth Baker
7

Je pense que c'est ce que vous voulez:

<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"> 
Chit
la source
3

EDIT : Je vois maintenant par les commentaires que vous demandez sur le texte du bouton, et non sur le chemin du fichier. Ma faute. Je laisse ma réponse originale ci-dessous au cas où quelqu'un d'autre qui tomberait sur cette question l'interpréterait comme je l'ai fait à l'origine.

2ème EDIT : J'avais supprimé cette réponse car j'ai décidé que j'avais mal compris la question et ma réponse n'était pas pertinente. Cependant, les commentaires dans une autre réponse ont indiqué que les gens voulaient toujours voir cette réponse, donc je la supprime.

MA RÉPONSE ORIGINALE (je pensais que l'OP demandait le chemin, pas le texte du bouton):

Ce n'est pas une fonctionnalité prise en charge pour des raisons de sécurité . Le navigateur Web Opera le supportait mais il a été supprimé. Réfléchissez à ce qui serait possible si cela était soutenu; Vous pouvez créer une page avec une entrée de téléchargement de fichier, la pré-remplir avec un chemin d'accès à un fichier sensible, puis soumettre automatiquement le formulaire en utilisant javascript déclenché par l' onloadévénement. Cela se produirait trop rapidement pour que l'utilisateur puisse faire quoi que ce soit à ce sujet.

Asaph
la source
3

Utiliser <label>pour la légende

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

Cela fonctionne sans javascript . Vous pouvez décorer l'étiquette à n'importe quel degré de complexité, à votre guise. Lorsque vous cliquez sur l'étiquette, le clic est automatiquement redirigé vers l'entrée du fichier. L'entrée de fichier elle-même peut être rendue invisible par n'importe quelle méthode. Si vous souhaitez que l'étiquette apparaisse comme un bouton, il existe de nombreuses solutions, par exemple:

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

    text-decoration: none;
    color: initial;
}
MKaama
la source
2

Seule classe CSS et bootstrap

        <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>
mahmood kabi
la source
1
  1. Avant cela <input type="file">, ajoutez une image et <input style="position:absolute">elle occupera l'espace de<input type="file">
  2. Utilisez le CSS suivant pour l'élément de fichier

    position:relative;  
    opacity:0;  
    z-index:99;
Bibaswann Bandyopadhyay
la source
0

si vous utilisez des rails et que vous rencontrez des problèmes pour l'appliquer, je voudrais ajouter quelques conseils de la réponse originale publiée par @Fernando Kosh

  • Téléchargez le fichier zip et copiez le fichier bootstrap-filestyle.min.js ke app / assets / javascripts /
  • ouvrez votre application.js et ajoutez cette ligne ci-dessous

    // = nécessite bootstrap-filestyle.min

  • ouvrez votre café et ajoutez cette ligne

    $ (": file"). filestyle ({buttonName: "btn-primary", buttonBefore: true, buttonText: "Votre texte ici", icône: false});

widjajayd
la source
0

Vous pouvez simplement ajouter une astuce css. vous n'avez pas besoin de javascript ou de plusieurs fichiers d'entrée et je conserve l' attribut de valeur existant . vous devez ajouter uniquement css . vous pouvez essayer cette solution.

.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" />

Udara Kasun
la source
0

Voici un moyen de "changer" le texte d'une entrée avec un type de fichier, avec du HTML pur et du javascript:

<input id='browse' type='file' style='width:0px'>
<button id='browser' onclick='browse.click()'>
    *The text you want*
</button>
IntelarX
la source
0

pour moi, cela ne fonctionne pas avec le texte personnalisé avec bootstrap-filestyle . Cela aide à la décoration des boutons mais le texte est bizarre à changer, avant d'entrer dans la lutte avec CSS, j'essaie ce qui suit:

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

bootstrap-filestyle rend le composant comme span avec une classe nommée butonText, donc lorsque le document se charge, changez simplement le texte. facile à droite et il doit fonctionner sur tous les navigateurs.

à votre santé

Boris Ch.F
la source
0

Je l'ai fait comme ça pour mon projet:

.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
la source
-1

Il s'agit d'une solution alternative qui peut vous être utile. Cela masque le texte qui apparaît hors du bouton, le mélangeant avec la couleur d'arrière-plan du div. Ensuite, vous pouvez donner au div un titre que vous aimez.

<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
la source
Dans Chrome 39, je vois à la fois le texte UPLOAD IMAGE et le bouton <input>. Peut-être que la gestion des entrées de fichiers par Chrome a changé depuis que vous avez publié cela?
EricP
@ yan-bellavance qu'est-ce que tu fais? Si vous pensez qu'une réponse est incorrecte ou pas utile, votez contre, mais ne la défigurez en aucune façon!
Kaiido