Bagaimana cara menyesuaikan <input type = "file">?

164

Apakah mungkin untuk mengubah tampilan <input type="file">?

Pemula Pemula
sumber
Alasan bidang teks ada karena itu menunjukkan pengguna jalur file setelah mereka menelusuri dan memilih file mereka.
k ke z
Oooppss .. sepertinya cara Firefox menangani itu ...
Newbie Coder
Jadi kami jelas, bahkan setelah mereka menelusuri file, mereka masih harus mengirimkan formulir dengan tombol kirim formulir.
k ke z
2
Silakan lihat solusi ini untuk cara yang lebih sederhana untuk melakukannya.
Joeytje50
1
Agak aneh untuk menandai pertanyaan di masa depan sebagai duplikat dari pertanyaan yang lebih tua. Apakah itu akan menetapkan prioritas yang mengajukan kembali pertanyaan dan kemudian menutup yang asli tidak apa-apa? Duplikat sudah menjadi masalah besar di sini. Saya memang melihat manfaatnya dalam mengajukan kembali pertanyaan di mana jawaban yang ada sudah basi , tetapi selalu mungkin untuk mengedit pertanyaan dan menambah / mengedit jawaban baru.
alex

Jawaban:

235

Anda tidak dapat memodifikasi banyak tentang input[type=file]kontrol itu sendiri.

Karena mengklik labelelemen dengan benar dipasangkan dengan input akan mengaktifkan / memfokuskannya, kita dapat menggunakan a labeluntuk memicu dialog penelusuran OS.

Inilah cara Anda dapat melakukannya ...

label {
   cursor: pointer;
   /* Style as you please, it will become the visible UI component. */
}

#upload-photo {
   opacity: 0;
   position: absolute;
   z-index: -1;
}
<label for="upload-photo">Browse...</label>
<input type="file" name="photo" id="upload-photo" />

CSS untuk kontrol formulir akan membuatnya tampak tidak terlihat dan tidak memakan ruang di tata letak dokumen, tetapi akan tetap ada sehingga dapat diaktifkan melalui label.

Jika Anda ingin menampilkan jalur yang dipilih pengguna setelah pemilihan, Anda dapat mendengarkan changeacara dengan JavaScript dan kemudian membaca jalur yang disediakan peramban untuk Anda (untuk alasan keamanan, itu bisa berbohong kepada Anda tentang jalur yang tepat). Cara untuk membuatnya cantik bagi pengguna akhir adalah dengan hanya menggunakan nama dasar dari jalur yang dikembalikan (sehingga pengguna hanya melihat nama file yang dipilih).

Ada panduan hebat dari Tympanus untuk menata gaya ini.

alex
sumber
2
Saya percaya, ini adalah gaya yang lebih baik, mengingat kami bertujuan untuk memilih dialog file yang akan dibuka dengan mengklik di mana saja pada wadah:#container { position: relative; width: ...px; height: ...px; overflow: hidden; } #input { position: absolute; right: 0; font-size: <many a>px; opacity: 0; margin: 0; padding: 0; border: none; }
x-yuri
1
Menggunakan <label>(seperti yang ditunjukkan oleh Tympanus) jauh lebih semantik dan kurang hacky. Juga, pertanyaan ini ditanyakan lagi beberapa tahun kemudian dan memiliki jawaban yang jauh lebih baik di sana: gaya kustom lintas-browser untuk tombol unggah file .
Dan Dascalescu
1
@DanDascalescu Saya setuju, jika saya dapat mengingat dengan benar (pada tahun 2011) ada masalah dengan IE, mungkin 6 atau 7. Saya akan mengedit jawaban ini untuk membawanya ke masa depan sekarang.
alex
Mengapa lebih baik menggunakan label? Anda tidak dapat men-tab label, selain itu, tombol lebih masuk akal bagi saya daripada label untuk mengaktifkan dialog.
Louis-Marie Matthews
1
@alex, Ini tidak menampilkan nama file.
Naren Verma
33

Mungkin sesuatu seperti itu?

<form>
  <input id="fileinput" type="file" style="display:none;"/>
</form>
<button id="falseinput">El Cucaratcha, for example</button>
<span id="selected_filename">No file selected</span>

<script>
$(document).ready( function() {
  $('#falseinput').click(function(){
    $("#fileinput").click();
  });
});
$('#fileinput').change(function() {
  $('#selected_filename').text($('#fileinput')[0].files[0].name);
});

</script>
Konservin
sumber
1
Dalam hal ini yaitu 9 tidak akan mengizinkan untuk mengirim formulir ke iframe.
x-yuri
@ x-yuri apa maksudmu?
Micaël Félix
2
Sejauh yang saya ingat, yaitu 9 (dan mungkin yang lain) tidak akan mengizinkan untuk mengirim formulir ke iframe, karena pengguna tidak mengklik file input.
x-yuri
display: noneakan menghapus input dari urutan tab, membuat halaman menjadi kurang dapat diakses. Menggunakan <label>(seperti yang ditunjukkan oleh Tympanus) jauh lebih semantik dan kurang hacky. Juga, pertanyaan ini ditanyakan lagi beberapa tahun kemudian dan memiliki jawaban yang jauh lebih baik di sana: gaya kustom lintas-browser untuk tombol unggah file .
Dan Dascalescu
memperbaiki kesalahan ketik braket kotak dalam pemilih untuk membuat kode benar-benar berfungsi
Constantin Groß
23
  <label for="fusk">dsfdsfsd</label>
  <input id="fusk" type="file" name="photo" style="display: none;">

kenapa tidak? ^ _ ^

Lihat contoh di sini

jt3k
sumber
4
@InakiIbarrolaAtxa dapatkah Anda memberikan data untuk mendukung ini?
Ben Leggiero
1
Tidak menata apa pun di Chrome 51. Menggunakan <label>(seperti yang ditunjukkan oleh Tympanus) adalah solusi yang semantik benar. Juga, pertanyaan ini ditanyakan lagi beberapa tahun kemudian dan memiliki jawaban yang jauh lebih baik di sana: gaya kustom lintas-browser untuk tombol unggah file .
Dan Dascalescu
12

Jika Anda menggunakan bootstrap di sini adalah solusi yang lebih baik:

<label class="btn btn-default btn-file">
    Browse <input type="file" style="display: none;">
</label>

Untuk IE8 dan di bawah ini http://www.abeautifulsite.net/whipping-file-inputs-into-shape-with-bootstrap-3/

Sumber: https://stackoverflow.com/a/18164555/625952

Ouadie
sumber
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah. - Dari Ulasan
Tom
Selesai, saya baru saja memasukkan sebuah contoh
Ouadie
10

Cara termudah ..

<label>
     Upload
    <input type="file" style="visibility: hidden;"/>
</label>
caden311
sumber
Kenapa tidak ada yang memperhatikan ini.
rootExplorr
1
Saya terlambat ke permainan
caden311
6

Di webkit Anda dapat mencoba ini ...

input[type="file"]::-webkit-file-upload-button{
   /* style goes here */
}
Christopher Reid
sumber
apakah Anda tahu solusi serupa untuk firefox? Apakah itu ada )
Artem Z.
5

pertama-tama ini adalah wadah:

<div class="upload_file_container">
    Select file!
    <input type="file" name="photo" />
</div>

Yang kedua, ini adalah gaya CSS, jika Anda ingin kustomisasi yang lebih nyata, jaga agar mata Anda tetap terbuka :)

.upload_file_container{
   width:100px;
   height:40px;
   position:relative;
   background(your img);
}

.upload_file_container input{
   width:100px;
   height:40px;
   position:absolute;
   left:0;
   top:0;
   cursor:pointer;
}

Contoh ini tidak memiliki gaya untuk teks di dalam tombol, itu tergantung pada ukuran font, cukup perbaiki nilai tinggi dan padding-top untuk wadah

Juri Karasjov
sumber
Saya bertanya-tanya mengapa Anda tidak membuatnya right: 0, bukan left: 0? Dengan begitu Anda akan memiliki kotak teks yaitu dari wadah. Mengklik pada kotak teks tidak membuka dialog file pilih. Juga, saya percaya membuat file input besar dengan font-sizeide yang jauh lebih baik, kemudian menggunakan widthdan height.
x-yuri
5

Caranya adalah menyembunyikan input dan menyesuaikan label.

masukkan deskripsi gambar di sini

HTML:

<div class="inputfile-box">
  <input type="file" id="file" class="inputfile" onchange='uploadFile(this)'>
  <label for="file">
    <span id="file-name" class="file-box"></span>
    <span class="file-button">
      <i class="fa fa-upload" aria-hidden="true"></i>
      Select File
    </span>
  </label>
</div>

CSS:

.inputfile-box {
  position: relative;
}

.inputfile {
  display: none;
}

.container {
  display: inline-block;
  width: 100%;
}

.file-box {
  display: inline-block;
  width: 100%;
  border: 1px solid;
  padding: 5px 0px 5px 5px;
  box-sizing: border-box;
  height: calc(2rem - 2px);
}

.file-button {
  background: red;
  padding: 5px;
  position: absolute;
  border: 1px solid;
  top: 0px;
  right: 0px;
}

JS:

function uploadFile(target) {
    document.getElementById("file-name").innerHTML = target.files[0].name;
}

Anda dapat memeriksa contoh ini: https://jsfiddle.net/rjurado/hnf0zhy1/4/

Drinor
sumber
Saya suka bagaimana Anda menggunakan ikon Font Awesome, tidak seperti yang lain.
Max Voisard
4

Jauh lebih baik jika Anda hanya menggunakan <label>, menyembunyikan <input>, dan menyesuaikan label.

HTML:

<input type="file" id="input">
<label for="input" id="label">Choose File</label>

CSS:

input#input{
    display: none;
}
label#label{
    /* Customize your label here */
}
Bogdan M.
sumber
display: noneakan menghapus elemen dari urutan tab. Menggunakan <label>(seperti yang ditunjukkan oleh Tympanus) adalah cara semantik yang benar, tetapi membutuhkan beberapa penyempurnaan. Juga, pertanyaan ini ditanyakan lagi beberapa tahun kemudian dan memiliki jawaban yang jauh lebih baik di sana: gaya kustom lintas-browser untuk tombol unggah file .
Dan Dascalescu
2

untuk menampilkan jalur file yang dipilih, Anda dapat mencoba ini di html:

<div class="fileinputs">
    <input type="file" class="file">
</div>

dan dalam javascript:

        var fakeFileUpload = document.createElement('div');
        fakeFileUpload.className = 'fakefile';
        var image = document.createElement('div');
        image.className='fakebtn';
        image.innerHTML = 'browse';
        fakeFileUpload.appendChild(image);
        fakeFileUpload.appendChild(document.createElement('input'));
        var x = document.getElementsByTagName('input');
        for (var i=0;i<x.length;i++) {
            if (x[i].type != 'file') continue;
            if (x[i].parentNode.className != 'fileinputs') continue;
            x[i].className = 'file hidden';
            var clone = fakeFileUpload.cloneNode(true);
            x[i].parentNode.appendChild(clone);
            x[i].relatedElement = clone.getElementsByTagName('input')[0];
            x[i].onchange = x[i].onmouseout = function () {
                this.relatedElement.value = this.value;
            }
        }

dan gaya:

div.fileinputs {
    position: relative;
    height: 30px;
    width: 370px;
}
input.file.hidden {
    position: relative;
    text-align: right;
    -moz-opacity: 0;
    filter: alpha(opacity: 0);
    opacity: 0;
    z-index: 2;
}
div.fakefile {
    position: absolute;
    top: 0px;
    left: 0px;
    right: 0;
    width: 370px;
    padding: 0;
    margin: 0;
    z-index: 1;
    line-height: 90%;
}
div.fakefile input {
    margin-bottom: 5px;
    margin-left: 0;
    border: none;
    box-shadow: 0px 0px 2px 1px #ccc;
    padding: 4px;
    width: 241px;
    height: 20px;
}
div.fakefile .fakebtn{
    width: 150px;
    background: #eb5a41;
    z-index: 10;
    font-family: roya-bold;
    border: none;
    padding: 5px 15px;
    font-size: 18px;
    text-align: center;
    cursor: pointer;
    -webkit-transition: all 0.4s ease;
    -moz-transition: all 0.4s ease;
    -o-transition: all 0.4s ease;
    -ms-transition: all 0.4s ease;
    transition: all 0.4s ease;
    display: inline;
    margin-left: 3px;
}
div.fileinputs input[type="file"]:hover + div .fakebtn{
    background: #DA472E;
}

div.fileinputs input[type="file"] {
    opacity: 0;
    position: absolute;
    top: -6px;
    right: 0px;
    z-index: 20;
    width: 102px;
    height: 40px;
    cursor: pointer;
}
saghar.fadaei
sumber
Salam saghar, Ini adalah jawaban terbaik untukku, terima kasih
ucMedia
2

Contoh bootstrap

<label className="btn btn-info btn-lg">
  Upload
  <input type="file" style="display: none" />
</label>
juliankmazo
sumber
1

Saya memilih opsi ini yang menjelaskan cara menyesuaikan sepenuhnya tombol browse dengan memasukkan penangan nama file yang diunggah, juga disesuaikan. Itu menambahkan bidang tambahan dan kontrol sisi klien pada mereka hanya untuk menunjukkan bagaimana memasukkan browse dalam bentuk "nyata", bukan hanya mandiri.

Berikut codepen: http://codepen.io/emiemi/pen/zxNXWR

JS:

//click on our custom btn triggers a click on the hidden actual file input 
$("#btnup").click(function(){
   $("#fileup").click();    
});


//changes on the three fields (input, tit,and name) trigger a control which checks if the 3 fields are all filled and if file field is valid (an image is uploaded)
$('#fileup').change(function(){
    var formDOMObj = document.upload;
//here we assign tu our text field #fileup the name of the selected file  
    var res=$('#fileup').val();
    var arr = res.split("\\");
//if file is not valid we show the error icon and the red alert
    if (formDOMObj.fileup.value.indexOf(".jpg") == -1 && formDOMObj.fileup.value.indexOf(".png") == -1 &&  formDOMObj.fileup.value.indexOf(".jpeg") == -1 && formDOMObj.fileup.value.indexOf(".bmp") == -1 && formDOMObj.fileup.value.indexOf(".JPG") == -1 && formDOMObj.fileup.value.indexOf(".PNG") == -1 &&  formDOMObj.fileup.value.indexOf(".JPEG") == -1 && formDOMObj.fileup.value.indexOf(".BMP") == -1){
        $( ".imgupload" ).hide("slow"); 
        $( ".imguploadok" ).hide("slow");   
        $( ".imguploadstop" ).show("slow");
        $('#nomefile').css({"color":"red","font-weight":700});
        $('#nomefile').html("The file "+arr.slice(-1)[0]+" is not an image!");
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }else{
 //if file is valid we show the green alert
    $( ".imgupload" ).hide("slow");
    $( ".imguploadstop" ).hide("slow");
    $( ".imguploadok" ).show("slow");
    $('#nomefile').html(arr.slice(-1)[0]);
    $('#nomefile').css({"color":"green","font-weight":700});
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
  //if all three fields are valid the fake input btn is hidden and the actual one i s finally hown
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }
    }
});


$('#nome').change(function(){
//same as file change but on name field
    var formDOMObj = document.upload;
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }else{
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }
});
$('#tit').change(function(){
 //same as file change but on tit field
    var formDOMObj = document.upload;
    if (formDOMObj.nome.value!=""&&formDOMObj.tit.value!=""&&formDOMObj.fileup.value!=""){
        $( "#fakebtn" ).hide();
        $( "#bottone" ).show();
    }else{
        $( "#bottone" ).hide();
        $( "#fakebtn" ).show();
    }
});

HTML:

<form name="upload" method="post" action="/" enctype="multipart/form-data" accept-charset="utf-8">
<div class="row">
  <div class="col-md-6 center">
<!--this is the actual file input, s hidden beacause we wanna use our custom one-->
    <input type="file" value="" class="hidden" name="fileup" id="fileup">
    <div class="btn-container">
<!--the three icons: default, ok file (img), error file (not an img)-->
      <h1 class="imgupload"><i class="fa fa-file-image-o"></i></h1>
      <h1 class="imguploadok"><i class="fa fa-check"></i></h1>
      <h1 class="imguploadstop"><i class="fa fa-times"></i></h1>
<!--this field changes dinamically displaying the filename we are trying to upload-->
      <p id="nomefile">Only pics allowed! (jpg,jpeg,bmp,png)</p>
<!--our custom btn which triggers the actual hidden one-->
      <button type="button" id="btnup" class="btn btn-primary btn-lg">Browse for your pic!</button>
    </div>
  </div>
<!--additional fields-->
  <div class="col-md-6">
    <div class="row">
      <div class="form-group" id="top">
        <div class="col-md-12">
          <input type="text" maxlength="100" class="form-control" name="nome" id="nome" placeholder="Your Name">
        </div>
      </div>
    </div>
    <div class="row">
      <div class="form-group">
        <div class="col-md-12">
          <input type="text" maxlength="50" class="form-control" name="tit" id="tit" placeholder="I am rubber, you are glue">
        </div>
      </div>
    </div>

    <div class="row">
      <div class="col-md-8">
        <p class="white">All fields are mandatory</p>
      </div>
      <div class="col-md-4">
<!--the defauld disabled btn and the actual one shown only if the three fields are valid-->
        <input type="submit" value="Submit!" class="btn btn-primary" id="bottone" style="padding-left:50px; padding-right:50px; display:none;">
        <button type="button" class="btn btn-default" disabled="disabled" id="fakebtn"  style="padding-left:40px; padding-right:40px;">Submit! <i class="fa fa-minus-circle"></i></button>
      </div>
    </div>
  </div>
</div>

Emi-C
sumber
0

Inilah salah satu cara yang saya suka karena itu membuat input mengisi seluruh wadah. Triknya adalah "font-size: 100px", dan harus dengan "overflow: hidden" dan posisi relatif.

<div id="upload-file-container" >
   <input type="file" />
</div>

#upload-file-container {
   width: 200px;
   height: 50px;
   position: relative;
   border: dashed 1px black;
   overflow: hidden;
}

#upload-file-container input[type="file"]
{
   margin: 0;
   opacity: 0;   
   font-size: 100px;
}
Vanja
sumber
Masuk akal untuk membuatnyaposition: absolute; right: 0; font-size: <many>px;
x-yuri
0

Anda bisa mendesainnya, tetapi Anda tidak bisa menghapus elemen yang sudah ada. Jika Anda kreatif, Anda dapat bekerja dengan itu dan melakukan sesuatu seperti ini:

input[type=file] {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    background: #EEE;
    background: linear-gradient(to top, #FFF, #DDD);
    border: thin solid rgba(0,0,0, .5);
    border-radius: .25em;
    box-shadow: inset .25em .25em .25em rgba(255,255,255, .5), inset -.1em -.1em .1em rgba(0,0,0, 0.1);
    cursor: text;
    padding: .25em;
}

http://jsfiddle.net/zr1x1m2b/1/

Saya sarankan Anda bermain-main dengan kode ini, menghapus garis, menambahkan sendiri, melakukan apa pun sampai Anda mendapatkan sesuatu yang Anda inginkan!

Ben Leggiero
sumber
1
Tidak menata kata "Pilih file". Menggunakan <label>(seperti yang ditunjukkan oleh Tympanus) adalah semantik dan menawarkan kemampuan penyesuaian yang lengkap. Juga, pertanyaan ini ditanyakan lagi beberapa tahun kemudian dan memiliki jawaban yang jauh lebih baik di sana: gaya kustom lintas-browser untuk tombol unggah file .
Dan Dascalescu
1
@DanDascalescu Anda benar! Saya hanya menawarkan solusi murni-CSS, jika Anda tidak dapat mengubah HTML dengan pengaturan Anda.
Ben Leggiero
0

Cukup gaya tombol normal seperti yang Anda inginkan, menggunakan CSS favorit Anda.

Kemudian panggil fungsi JS sederhana untuk membuat dan menautkan elemen input tersembunyi ke tombol gaya Anda. Jangan tambahkan CSS khusus browser untuk melakukan bagian persembunyian.

<!DOCTYPE html>
<meta charset="utf-8">

<style>
    button {
        width            : 160px;
        height           : 30px;
        font-size        : 13px;
        border           : none;
        text-align       : center;
        background-color : #444;
        color            : #6f0;
    }
    button:active {
        background-color : #779;
    }
</style>

<button id="upload">Styled upload button!</button>

<script>

function Upload_On_Click(id, handler) {
    var hidden_input = null;
    document.getElementById(id).onclick = function() {hidden_input.click();}
    function setup_hidden_input() {
        hidden_input && hidden_input.parentNode.removeChild(hidden_input);
        hidden_input = document.createElement("input");
        hidden_input.setAttribute("type", "file");
        hidden_input.style.visibility = "hidden";
        document.querySelector("body").appendChild(hidden_input);
        hidden_input.onchange = function() {
            handler(hidden_input.files[0]);
            setup_hidden_input();
        };
    }
    setup_hidden_input();
}

Upload_On_Click("upload", function(file) {
    console.log("GOT FILE: " + file.name);
});

</script>

Perhatikan bagaimana kode di atas menghubungkan kembali setelah setiap kali pengguna memilih file. Ini penting karena "onchange" hanya dipanggil jika pengguna mengubah nama file. Tetapi Anda mungkin ingin mendapatkan file setiap kali pengguna menyediakannya.

Untuk lebih jelasnya, teliti DropZone dan unggahan gmail.

personal_cloud
sumber
0

 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
            <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

Ini adalah unggahan / lampiran file saya yang berfungsi penuh dengan fungsi menggunakan jquery & javascript (Visual studio). Ini akan bermanfaat!

Kode akan tersedia di bagian komentar!

Tautan: https://youtu.be/It38OzMAeig

Nikmati :)

 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
   <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 $(document).ready(function () {
        $(document).mousemove(function () {
        $('#myList').css('display', 'block');
        $("#seebtn").css('display', 'none');
        $("#hidebtn").css('display', 'none');
        $('#displayFileNames').html('');
        $("#myList").html('');
        var fileArray1 = document.getElementsByClassName('file-input');
        for (var i = 0; i < fileArray1.length; i++) {
            var files = fileArray1[i].files;
            for (var j = 0; j < files.length; j++) {
                $("#myList").append("<li style='color:black'>" + files[j].name + "</li>");
            }
        };

        if (($("#myList").html()) != '') {
            $('#unselect').css('display', 'block');
            $('#divforfile').css('color', 'green');
            $('#attach').css('color', 'green');
            $('#displayFileNames').html($("#myList").children().length + ' ' + 'files selezionato');

        };

        if (($("#myList").html()) == '') {
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');
            $('#displayFileNames').append('Nessun File Selezionato');
        };
    });

  });

  function choosefiles(obj) {
        $(obj).hide();
        $('#myList').css('display', 'none');
        $('#hidebtn').css('display', 'none');
        $("#seebtn").css('display', 'none');
        $('#unselect').css('display', 'none');
        $("#upload-form").append("<input class='file-input inputs' type='file' onclick='choosefiles(this)' name='file[]' multiple='multiple' />");
        $('#displayFileNames').html('');
    }

  $(document).ready(function () {
        $('#unselect').click(function () {
            $('#hidebtn').css('display', 'none');
            $("#seebtn").css('display', 'none');
            $('#displayFileNames').html('');
            $("#myList").html('');
            $('#myFileInput').val('');
            document.getElementById('upload-form').reset();         
            $('#unselect').css('display', 'none');
            $('#divforfile').css('color', 'black');
            $('#attach').css('color', 'black');

        });
    });
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
  .divs {
        position: absolute;
        display: inline-block;
        background-color: #fff;
    }

    .inputs {
        position: absolute;
        left: 0px;
        height: 2%;
        width: 15%;
        opacity: 0;
        background: #00f;
        z-index: 100;
    }

    .icons {
        position: absolute;
    }

 </style>
 <div>
                <form id='upload-form' action='' method='post' enctype='multipart/form-data'>
                   
                    <div class="divs" id="divforfile" style="color:black">
                        <input id='myFileInput' class='file-input inputs' type='file' name='file[]' onclick="choosefiles(this)" multiple='multiple' />
                        <i class="material-icons" id="attach" style="font-size:21px;color:black">attach_file</i><label>Allegati</label>
                    </div>
                </form>
                <br />
            </div>
            <br />  
            <div>
                <button style="border:none; background-color:white; color:black; display:none" id="seebtn"><p>Files &#9660;</p></button>
                <button style="border:none; background-color:white; color:black; display:none" id="hidebtn"><p>Files &#9650;</p></button>
                <button type="button" class="close" aria-label="Close" id="unselect" style="display:none;float:left">
                    <span style="color:red">&times;</span>
                </button>
                <div id="displayFileNames">
                </div>
                <ul id="myList"></ul>
            </div>

Milan Madubasha
sumber
0

Berikut ini adalah solusi CSS murni yang cepat (berfungsi pada chrome dan memiliki cadangan FireFox termasuk), termasuk nama file, label dan tombol unggah kustom, melakukan apa yang seharusnya - tidak perlu JavaScript sama sekali! 🎉

Catatan: ☝ Ini berfungsi di Chrome dan memiliki FireFox fallback - lagipula, saya tidak akan menggunakannya di situs web dunia nyata - jika kompatibilitas browser sesuai untuk Anda (apa yang seharusnya). Jadi ini lebih eksperimental.

.fileUploadInput {
  display: grid;
  grid-gap: 10px;
  position: relative;
  z-index: 1; }
  
  .fileUploadInput label {
    display: flex;
    align-items: center;
    color: setColor(primary, 0.5);
    background: setColor(white);
    transition: .4s ease;
    font-family: arial, sans-serif;
    font-size: .75em;
    font-weight: regular; }
    
  .fileUploadInput input {
    position: relative;
    z-index: 1;
    padding: 0 gap(m);
    width: 100%;
    height: 50px;
    border: 1px solid #323262;
    border-radius: 3px;
    font-family: arial, sans-serif;
    font-size: 1rem;
    font-weight: regular; }
    .fileUploadInput input[type="file"] {
      padding: 0 gap(m); }
      .fileUploadInput input[type="file"]::-webkit-file-upload-button {
        visibility: hidden;
        margin-left: 10px;
        padding: 0;
        height: 50px;
        width: 0; }
        
  .fileUploadInput button {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 50px;
    height: 50px;
    line-height: 0;
    user-select: none;
    color: white;
    background-color: #323262;
    border-radius: 0 3px 3px 0;
    font-family: arial, sans-serif;
    font-size: 1rem;
    font-weight: 800; }
    .fileUploadInput button svg {
      width: auto;
      height: 50%; }

* {
  margin: 0px;
  padding: 0px;
  box-sizing: border-box;
  border: 0px;
  outline: 0;
  background-repeat: no-repeat;
  appearance: none;
  border-radius: 0;
  vertical-align: middle;
  font-weight: inherit;
  font-style: inherit;
  font-family: inherit;
  text-decoration: none;
  list-style: none;
  user-select: text;
  line-height: 1.333em; }

body {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100vh;
  background: rgba(66, 50, 98, 0.05); }

.container {
  padding: 25px;
  box-shadow: 0 0 20px rgba(66, 50, 98, 0.35);
  border: 1px solid #eaeaea;
  border-radius: 3px;
  background: white; }

@-moz-document url-prefix() {
.fileUploadInput button{
    display: none
}
}
<!-- Author: Ali Soueidan-->
<!-- Author URI: https//: www.alisoueidan.com-->

<div class="container">
    <div class="fileUploadInput">
    <label>✨ Upload File</label>
    <input type="file" />
    <button>+</button></div>
</div>

tukang perahu
sumber
-2

Ini adalah salah satu cara yang saya temukan baru-baru ini, dengan sedikit jQuery

Kode HTML:

<form action="">
    <input type="file" name="file_upload" style="display:none" id="myFile">

    <a onclick="fileUpload()"> Upload a file </a>
</form>

Untuk bagian javascript / jQuery:

<script>
function fileUpload() {
    $("#myFile").click();
}
</script>

Dalam contoh ini, saya telah memasang tag "jangkar" untuk memicu unggahan file. Anda dapat mengganti dengan apa pun yang Anda inginkan, ingatlah untuk meletakkan atribut "onclick" dengan fungsi yang tepat.

Semoga ini membantu!

PS: Jangan lupa untuk menyertakan jQuery dari CDN atau sumber lain

Aakash
sumber
display: noneakan menghapus input dari urutan tab. Menggunakan <label>(seperti yang ditunjukkan oleh Tympanus) jauh lebih semantik dan kurang hacky. Juga, pertanyaan ini ditanyakan lagi beberapa tahun kemudian dan memiliki jawaban yang jauh lebih baik di sana: gaya kustom lintas-browser untuk tombol unggah file .
Dan Dascalescu