Using simple_form_for, Bootstrap et Rails 3. Dans un formulaire:
<%= f.input :upload, label: 'PDF file:' , input_html: {accept: ('application/pdf') } %>
Je ne sais pas comment j'appellerais cela pour que le bouton "choisir un fichier" puisse avoir une classe différente ("btn btn-primary").
De plus, lors de l’utilisation avec Bootstrap au moins, il est très mal aligné par défaut. Voir l'image ci-jointe.
Enfin, comment puis-je redéfinir le texte de "Aucun fichier choisi" à "Choisir un fichier" quand aucun fichier n'a encore été ajouté et afficher le nom du fichier lorsqu'il en existe un?
Voici comment je le fais:
Ajouter un bouton pour déclencher la boîte de dialogue de recherche de fichier
<div class="control-group">
<div class="attach-set">
<%= f.input :real_file, input_html: { hidden: true }, label: 'Upload Attachment' %>
<div class="input-append">
<input id="file-display" class="input-large uneditable-input" type="text">
<a id="upload-btn" class="btn"><i class="icon-upload-alt"></i> Browse</a>
</div>
</div> <!-- /attach-set -->
</div> <!-- /control-group -->
Dans votre JS (Café avec jQuery affiché), passez le clic du bouton d’affichage sur l’entrée de fichier réelle et quand ils sélectionnent un fichier, déposez le nom du fichier dans le champ de texte à afficher C:\FakePath ....)
$(document).ready ->
# ------------------------------------------------------
# pretty-fy the upload field
# ------------------------------------------------------
$realInputField = $('#real_file')
# drop just the filename in the display field
$realInputField.change ->
$('#file-display').val $(@).val().replace(/^.*[\\\/]/, '')
# trigger the real input field click to bring up the file selection dialog
$('#upload-btn').click ->
$realInputField.click()
Cela a fonctionné très bien pour moi et ne nécessite que du code HTML
<label class="btn btn-primary">
Add a file!
<span style="display:none;">
<%= f.file_field :image, required: true, multiple: true, name: 'picture' %>
</span>
</label>
Je suis tombé sur et utilise l'extension de Jasny à Bootstrap 3 . Cela semble bien fonctionner jusqu'à présent.
scss
.fileinput-button {
position: relative;
overflow: hidden;
float: left;
margin-right: 4px;
width: 110px;
height: 32px;
input{
opacity: 0;
filter: alpha(opacity=0);
transform: translate(-300px, 0) scale(4);
direction: ltr;
cursor: pointer;
}
}
html/slim
span class="btn btn-success fileinput-button"
i.fa.fa-pencil
span
| Select File
= f.file_field :cover_ar
Je recommande d'utiliser la boussole pour la compatibilité entre navigateurs
Chaque navigateur a un type différent de bouton de champ de saisie de fichier, ce qui en fait un problème. Vous pouvez jouer un peu avec css. Cela m'a donné un style de base avec JS sans le texte ennuyeux "Aucun fichier choisi" en chrome et Safary:
$(document).ready(function() {
$(".your_button").css("width", "80px");
});
Sinon, la meilleure solution consiste à le masquer et à en afficher un faux qui intercepte le clic:
http://duckranger.com/2012/06/pretty-file-input-field-in-bootstrap/
En ce qui concerne la question de savoir comment montrer qu'un fichier a été téléchargé, une solution de base avec le téléchargement de fichier jquery consiste à détecter l'événement de fin de téléchargement et à remplacer une partie de votre texte par un message de réussite possible d'obtenir avec les navigateurs modernes):
$(".your_button").fileupload({
dataType: "json",
done: function(e, data) {
$(".place_for_your_text").text("File uploaded.");
}
});
En résumé, une solution de base consiste à utiliser JavaScript dans vos actifs pour:
Comme @rafaelfranca a dit que vous ne pouvez pas styler une entrée file
mais vous pouvez ajouter votre propre bouton qui cliquera sur votre bouton d'origine masqué. Voir exemple ici http://jsfiddle.net/rUdf2/6/
Pas de fantaisie requis:
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);
});
});
ATTENTION: Les trois éléments de formulaire en question DOIVENT être des frères et soeurs distincts (.image-fichier-choisi, .image-fichier-bouton, fichier .image)
Si vous utilisez Bootstrap, Simple Forms, Jasny et ReFile, ce message peut vous intéresser refile, méthode simple_form undefined, attachment_field