Jak automatycznie przesłać formularz przesyłania po wybraniu pliku?


154

Mam prosty formularz przesyłania plików. Jak ustawić automatyczne przesyłanie po wybraniu pliku? Nie chcę, aby użytkownik musiał klikać przycisk Prześlij.


9
Co się stanie, jeśli użytkownik wybierze niewłaściwy plik? IMO, należy pozostawić użytkownikowi wybór, kiedy przesłać.
Tyler Crompton,

2
@Tyler Większość ludzi wybierze właściwy plik, a ja staram się zmniejszyć tarcie UX. Osoby, które wybiorą niewłaściwy plik, mogą po przesłaniu go usunąć.
ram1

3
„większość ludzi” podejmuje mądre decyzje, ale większość nie.
Phix,

2
Zgadzam się z @TylerCrompton, użytkownicy będą popełniać najgłupsze błędy i obwiniają Cię za to, możesz dodać cofnięcie po przesłaniu.
Ross Keddy

3
najlepszą odpowiedzią jest najprostsza odpowiedź stackoverflow.com/a/25893747/1536309
Blair Anderson

Odpowiedzi:


194

Możesz po prostu wywołać submitmetodę swojego formularza w onchangeprzypadku wprowadzenia pliku.

document.getElementById("file").onchange = function() {
    document.getElementById("form").submit();
};

http://jsfiddle.net/cwvc4/73/


4
Działa to w Safari, gdzie rozwiązanie jQuery wydaje się nie działać. Dziwne?
henrywright

2
@henrywright: Tak. W jQuery Submit()wywołanie wyzwala submitzdarzenie jQuery , ale nie uruchamia podstawowego formularza submit(). Możesz oczywiście użyć $('form')[0].submit()do trafienia elementu DOM za pomocą jQuery
Gone Coding

68

Po prostu powiedz file-input, aby automatycznie przesłał formularz po każdej zmianie:

<form action="http://example.com">
    <input type="file" onchange="form.submit()" />
</form>

To rozwiązanie działa tak:

  • onchangepowoduje, że element wejściowy wykonuje następujący skrypt, po każdej valuemodyfikacji
  • form odwołuje się do formularza, którego częścią jest ten element wejściowy
  • submit() powoduje, że formularz wysyła wszystkie dane na adres URL określony w action

Zalety tego rozwiązania:

  • Działa bez ids. Ułatwia życie, jeśli masz kilka formularzy na jednej stronie html.
  • Natywny javascript, nie jest wymagany jQuery ani podobny.
  • Kod znajduje się wewnątrz tagów html. Jeśli sprawdzisz kod HTML, od razu zobaczysz jego zachowanie.

48

Korzystanie z jQuery:

$('#file').change(function() {
  $('#target').submit();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="target" action="destination.html">
  <input type="file" id="file" value="Go" />
</form>


również to samo pytanie było na stackoverflow: stackoverflow.com/questions/4704154/…
Samich

Czy to podejście działa w Safari? Nie jestem pewny. Przetestowałem Chrome, IE i FF, które działają.
henrywright

@ErdalG: Działająca wersja jQuery dodana poniżej. Pozwala uniknąć tego problemu.
Gone Coding,

31

JavaScript ze onchangezdarzeniem:

<form action="upload.php" method="post" enctype="multipart/form-data">
     <input type="file" name="filename" onchange="javascript:this.form.submit();">
</form>

jQuery .change()oraz .submit():

$('#fileInput').change(function() {
  $('#myForm').submit();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<form action="upload.php" id="myForm">
     <input type="file" id="fileInput">
</form>


dodaj komentarz, jeśli głosujesz negatywnie, aby wyjaśnić, co jest nie tak lub co należy poprawić.
Alex.K.

9

Najkrótszym rozwiązaniem jest

<input type="file" name="file" onchange="javascript:document.getElementById('form').submit();" />

2
Co powiesz naonchange="this.form.submit()"
Vikkee

1
A co powiesz onchange="form.submit()"? :)
slartidan

5
<form id="thisForm" enctype='multipart/form-data'>    
  <input type="file" name="file" id="file">
</form>

<script>
$(document).on('ready', function(){
  $('#file').on('change', function(){
    $('#thisForm').submit();
  });
});
</script>

4

Jeśli korzystasz już z jQuery simple:

<input type="file" onChange="$(this).closest('form').submit()"/>

4

To jest moje rozwiązanie do przesyłania obrazów, gdy użytkownik wybrał plik.

Część HTML:

<form enctype="multipart/form-data" id="img_form" method="post">
    <input id="img_input" type="file" name="image" accept="image/*">
</form>

JavaScript:

document.getElementById('img_input').onchange = function () {
upload();
};
function upload() {
    var upload = document.getElementById('img_input');
    var image = upload.files[0];
    $.ajax({
      url:"/foo/bar/uploadPic",
      type: "POST",
      data: new FormData($('#img_form')[0]),
      contentType:false,
      cache: false,
      processData:false,
      success:function (msg) {}
      });
};

2

Wypróbuj poniższy kod z jQuery:

<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>

<script>
$(document).ready(function(){
    $('#myForm').on('change', "input#MyFile", function (e) {
        e.preventDefault();
        $("#myForm").submit();
    });
});
</script>
<body>
    <div id="content">
        <form id="myForm" action="action.php" method="POST" enctype="multipart/form-data">
            <input type="file" id="MyFile" value="Upload" />
        </form>
    </div>
</body>
</html>

+1, ponieważ jest to jedyna metoda, jaką znalazłem, która umożliwiła mi złapanie zdarzenia przesyłania za pomocą jquery. Inne metody wydają się omijać zdarzenie przesyłania, więc nie mogę sprawdzić formularza ani przesłać go za pomocą Ajax podczas ich używania. Dzięki
user1404617

1

Dla tych, którzy używają .NET WebForms, przesyłanie całej strony może nie być pożądane. Zamiast tego użyj tego samego onchangepomysłu, aby javascript kliknął ukryty przycisk (np. <Asp: Button ...), a ukryty przycisk może zająć resztę. Upewnij się, że robisz display: none;na przycisku, a nie Visible="false".


1

HTML

<form id="xtarget" action="upload.php">
<input type="file" id="xfilename">
</form>

JAVASCRIPT PURE

<script type="text/javascript">
window.onload = function() {
    document.getElementById("xfilename").onchange = function() {
        document.getElementById("xtarget").submit();
    }
};
</script>

1
<form action="http://example.com">
    <input type="file" onchange="Submit()" />
</form>

 <script>
     // it will submit form 0 or you have to select particular form
     document.getElementsByTagName("form")[0].submit();       
 </script>

0

Możesz umieścić ten kod, aby kod działał tylko z jedną linią kodu

<input type="file" onchange="javascript:this.form.submit()">

Spowoduje to przesłanie pliku na serwer bez klikania przycisku przesyłania

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.