Chciałbym przesłać plik asynchronicznie z jQuery.
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
Zamiast przesyłanego pliku otrzymuję tylko nazwę pliku. Co mogę zrobić, aby rozwiązać ten problem?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Sergio del Amo
źródło
źródło
Odpowiedzi:
Za pomocą HTML5 możesz przesyłać pliki za pomocą Ajax i jQuery. Ponadto możesz sprawdzać poprawność plików (nazwa, rozmiar i typ MIME) lub obsługiwać zdarzenie progress za pomocą znacznika postępu HTML5 (lub div). Ostatnio musiałem utworzyć program do przesyłania plików, ale nie chciałem używać Flasha, iframe ani wtyczek i po kilku badaniach wymyśliłem rozwiązanie.
HTML:
Po pierwsze, możesz przeprowadzić walidację, jeśli chcesz. Na przykład w
.on('change')
przypadku pliku:Teraz
$.ajax()
prześlij za pomocą kliknięcia przycisku:Jak widać, dzięki HTML5 (i niektórym badaniom) przesyłanie plików jest nie tylko możliwe, ale bardzo łatwe. Wypróbuj go z Google Chrome, ponieważ niektóre składniki HTML5 przykładów nie są dostępne w każdej przeglądarce.
źródło
name="file"
jest to bardzo ważne na<input>
znaczniku pliku, jeśli zamierzasz używać danych w PHP (i prawdopodobnie w innych miejscach). Formularz utworzyłem dynamicznie za pomocą javascript, więc nie potrzebowałem atrybutu name, ale dowiedziałem się, jak bardzo potrzebujesz go do odzyskania danych po stronie serwera.Aktualizacja 2019: Nadal zależy od przeglądarek, z których korzysta Twoja grupa demograficzna.
Ważną rzeczą do zrozumienia z „nowym”
file
API HTML5 jest to, że nie był obsługiwany aż do IE 10 . Jeśli konkretny rynek, na który chcesz dążyć, ma ponadprzeciętną skłonność do starszych wersji systemu Windows, możesz nie mieć do niego dostępu.Od 2017 r. Około 5% przeglądarek to przeglądarki IE 6, 7, 8 lub 9. Jeśli kierujesz się do dużej korporacji (np. Jest to narzędzie B2B lub coś, co dostarczasz na szkolenie), liczba ta może gwałtownie wzrosnąć . W 2016 roku miałem do czynienia z firmą używającą IE8 na ponad 60% swoich maszyn.
Od tej edycji jest rok 2019, prawie 11 lat po mojej pierwszej odpowiedzi. IE9 i niższe są na całym świecie około 1%, ale wciąż istnieją klastry o wyższym użyciu.
Ważną zaletą - niezależnie od funkcji - jest sprawdzenie, jakiej przeglądarki używają Twoi użytkownicy . Jeśli tego nie zrobisz, nauczysz się szybkiej i bolesnej lekcji na temat tego, dlaczego „praca dla mnie” nie jest wystarczająco dobra w dostawie do klienta. caniuse to przydatne narzędzie, ale pamiętaj, skąd biorą dane demograficzne. Mogą nie pasować do twojego. To nigdy nie jest prawdziwsze niż środowiska korporacyjne.
Moja odpowiedź z 2008 roku jest następująca.
Istnieją jednak realne metody przesyłania plików inne niż JS. Możesz utworzyć ramkę iframe na stronie (którą ukrywasz za pomocą CSS), a następnie skierować formularz do opublikowania w tej ramce iframe. Strona główna nie musi się poruszać.
To „prawdziwy” post, więc nie jest całkowicie interaktywny. Jeśli potrzebujesz statusu, potrzebujesz czegoś po stronie serwera, aby to przetworzyć. Różni się to znacznie w zależności od serwera. ASP.NET ma ładniejsze mechanizmy. Zwykły PHP zawiedzie, ale można go obejść za pomocą modyfikacji Perla lub Apache.
Jeśli potrzebujesz wielu plików do przesłania, najlepiej zrobić każdy plik pojedynczo (aby przekroczyć maksymalne limity przesyłania plików). Opublikuj pierwszy formularz w ramce iframe, monitoruj jego postęp, korzystając z powyższego, a po jego zakończeniu opublikuj drugi formularz w ramce iframe i tak dalej.
Lub użyj rozwiązania Java / Flash. Są znacznie bardziej elastyczni w tym, co mogą zrobić ze swoimi postami ...
źródło
W tym celu polecam użycie wtyczki Fine Uploader . Twój
JavaScript
kod to:źródło
Uwaga: ta odpowiedź jest nieaktualna, teraz można przesyłać pliki za pomocą XHR.
Nie można przesyłać plików za pomocą XMLHttpRequest (Ajax). Możesz symulować efekt za pomocą elementu iframe lub Flash. Doskonała wtyczka jQuery Form, która publikuje twoje pliki poprzez ramkę iframe, aby uzyskać efekt.
źródło
Podsumowanie dla przyszłych czytelników.
Asynchroniczne przesyłanie plików
Z HTML5
Możesz przesyłać pliki za pomocą jQuery przy użyciu
$.ajax()
metody, jeśli FormData i interfejs API plików są obsługiwane (obie funkcje HTML5).Możesz również wysyłać pliki bez FormData, ale w obu przypadkach interfejs API plików musi być obecny, aby przetwarzać pliki w taki sposób, aby można je było przesłać za pomocą XMLHttpRequest (Ajax).
Przykład szybkiego, czystego kodu JavaScript ( bez jQuery ) zawiera sekcja „ Wysyłanie plików przy użyciu obiektu FormData ”.
Fallback
Gdy HTML5 nie jest obsługiwane (bez interfejsu API plików ), jedynym innym czystym rozwiązaniem JavaScript (bez Flasha ani żadnej innej wtyczki do przeglądarki) jest technika ukrytego iframe , która pozwala emulować asynchroniczne żądanie bez użycia obiektu XMLHttpRequest .
Polega na ustawieniu elementu iframe jako celu formularza za pomocą danych wejściowych pliku. Gdy użytkownik przesyła żądanie, przesyłane są pliki, ale pliki są przesyłane, ale odpowiedź jest wyświetlana w ramce iframe zamiast ponownego renderowania strony głównej. Ukrywanie elementu iframe sprawia, że cały proces jest przezroczysty dla użytkownika i emuluje żądanie asynchroniczne.
Prawidłowo wykonane powinno działać praktycznie w każdej przeglądarce, ale ma pewne zastrzeżenia, jak uzyskać odpowiedź z iframe.
W takim przypadku możesz użyć wtyczki otoki, takiej jak Bifröst, która wykorzystuje technikę iframe, ale zapewnia także transport Ajax jQuery pozwalający na wysyłanie plików za pomocą tylko takiej
$.ajax()
metody:Wtyczki
Bifröst to tylko małe opakowanie, które dodaje obsługę rezerwową do metody ajax jQuery'ego, ale wiele z wyżej wymienionych wtyczek, takich jak jQuery Form Plugin lub jQuery File Upload, zawiera cały stos od HTML5 do różnych kopii zapasowych oraz kilka przydatnych funkcji ułatwiających ten proces. W zależności od potrzeb i wymagań możesz rozważyć implementację lub dowolną z tych wtyczek.
źródło
contentType: false
. Kiedy nie wysłałem tego z chrome, typ zawartości formularza został unieważniony przez jQuery..done()
i.fail()
wywołania zwrotne. Również przykład bez użyciaFormData
i lista zalet / wad byłby niesamowity.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Ta wtyczka jQuery przesyłająca plik AJAX przesyła plik gdzieś i przekazuje odpowiedź na wywołanie zwrotne, nic więcej.
<input type="file">
- Używaj tak mało jak -
- lub tyle co -
źródło
Korzystam z poniższego skryptu, aby przesyłać obrazy, które działają dobrze.
HTML
JavaScript
Wyjaśnienie
Korzystam z odpowiedzi,
div
aby wyświetlić animację przesyłania i odpowiedzi po zakończeniu przesyłania.Najlepsze jest to, że możesz przesłać dodatkowe dane, takie jak identyfikatory i itp. Z plikiem, gdy używasz tego skryptu. Wspomniałem o tym
extra-data
jak w skrypcie.Na poziomie PHP będzie to działać jak normalne przesyłanie plików. dodatkowe dane można odzyskać jako
$_POST
dane.Tutaj nie używasz wtyczki i innych rzeczy. Możesz zmienić kod, jak chcesz. Nie kodujesz na ślepo tutaj. Jest to podstawowa funkcjonalność każdego przesyłania plików jQuery. Właściwie JavaScript.
źródło
addEventListener
nie jest przeglądarką.Możesz to zrobić w waniliowym JavaScript z łatwością. Oto fragment mojego obecnego projektu:
źródło
ondrop
wydarzeniu możesz to zrobićvar file = e.dataTransfer.files[0]
Możesz przesłać po prostu za pomocą jQuery
.ajax()
.HTML:
CSS
JavaScript:
źródło
Najprostszym i najbardziej niezawodnym sposobem, w jaki to zrobiłem w przeszłości, jest po prostu celowanie w ukryty znacznik iFrame za pomocą formularza - następnie zostanie on przesłany w elemencie iframe bez ponownego ładowania strony.
To znaczy, jeśli nie chcesz używać wtyczki, JavaScript ani innych form „magii” innych niż HTML. Oczywiście możesz to połączyć z JavaScriptem lub czym ...
Możesz także przeczytać zawartość ramki iframe pod
onLoad
kątem błędów serwera lub odpowiedzi na sukces, a następnie przekazać ją użytkownikowi.Chrome, iFrames i onLoad
-Uwaga- musisz czytać dalej, jeśli jesteś zainteresowany tym, jak skonfigurować blokadę interfejsu użytkownika podczas przesyłania / pobierania
Obecnie Chrome nie wyzwala zdarzenia onLoad dla elementu iframe, gdy jest on używany do przesyłania plików. Firefox, IE i Edge wszystkie uruchamiają zdarzenie onload podczas przesyłania plików.
Jedyne rozwiązanie, które znalazłem, działa w przeglądarce Chrome, to użycie pliku cookie.
Aby to zrobić w zasadzie po uruchomieniu przesyłania / pobierania:
Używanie do tego pliku cookie jest brzydkie, ale działa.
Zrobiłem wtyczkę jQuery, aby poradzić sobie z tym problemem dla Chrome podczas pobierania, znajdziesz tutaj
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Ta sama podstawowa zasada dotyczy również przesyłania.
Aby użyć downloadera (oczywiście JS)
A po stronie serwera, tuż przed przesłaniem danych pliku, utwórz ciasteczko
Wtyczka zobaczy plik cookie, a następnie wyzwoli połączenie
onComplete
zwrotne.źródło
Rozwiązaniem, które znalazłem, było
<form>
ukrycie celu iFrame. Ramka iFrame może następnie uruchomić JS, aby wyświetlić użytkownikowi, że jest kompletny (podczas ładowania strony).źródło
Napisałem to w środowisku Rails . To tylko około pięciu wierszy JavaScript, jeśli używasz lekkiej wtyczki jQuery.
Wyzwaniem jest uruchomienie przesyłania AJAX, ponieważ standard
remote_form_for
nie rozumie przesyłania formularzy wieloczęściowych. Nie będzie wysyłał danych pliku, którego Rails szuka z żądaniem AJAX.Właśnie wtedy pojawia się wtyczka jQuery-form.
Oto kod Railsów:
Oto powiązany JavaScript:
A oto akcja kontrolera Railsów, całkiem waniliowa:
Używam tego od kilku tygodni z Bloggity i działa jak mistrz.
źródło
Simple Ajax Uploader to kolejna opcja:
https://github.com/LPology/Simple-Ajax-Uploader
Przykładowe użycie:
źródło
IE7+
! Wypróbuj teraz. DziękijQuery Uploadify to kolejna dobra wtyczka, której użyłem wcześniej do przesyłania plików. Kod JavaScript jest tak prosty, jak: kod. Jednak nowa wersja nie działa w przeglądarce Internet Explorer.
Przeprowadziłem wiele poszukiwań i doszedłem do innego rozwiązania do przesyłania plików bez żadnej wtyczki i tylko z ajaxem. Rozwiązanie jest następujące:
źródło
Oto kolejne rozwiązanie dotyczące sposobu przesyłania pliku ( bez żadnej wtyczki )
Korzystanie z prostych skryptów JavaScript i AJAX (z paskiem postępu)
Część HTML
Część JS
Część PHP
Oto przykładowa aplikacja
źródło
Możesz użyć danych formularza do opublikowania wszystkich swoich wartości, w tym obrazów.
źródło
cache: false
jest nadmiarowy naPOST
żądanie, ponieważPOST
nigdy nie buforuje.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Aby przesłać plik asynchronicznie za pomocą Jquery, wykonaj następujące czynności:
krok 1 W swoim projekcie otwórz menedżera Nuget i dodaj pakiet (pobierz plik jquery (wystarczy, że napiszesz go w polu wyszukiwania, pojawi się i zainstaluje.)) URL: https://github.com/blueimp/jQuery-File- Przekazać plik
krok 2 Dodaj poniższe skrypty w plikach HTML, które zostały już dodane do projektu, uruchamiając powyższy pakiet:
krok 3 Napisz kontrolę przesyłania pliku zgodnie z poniższym kodem:
krok 4 napisz metodę js jako uploadFile jak poniżej:
krok 5 Po przesłaniu pliku elementu wywołania funkcji gotowej, aby zainicjować proces, jak opisano poniżej:
krok 6 Napisz kontroler MVC i akcję zgodnie z poniższym opisem:
źródło
Nowoczesne podejście bez Jquery jest użycie FileList obiekt wrócisz od
<input type="file">
kiedy wybiera użytkownika pliku (ów), a następnie użyć Fetch aby opublikować FileList owinięty wokół FormData obiekt.źródło
Tutaj możesz zobaczyć rozwiązane rozwiązanie z działającą wersją demonstracyjną , która umożliwia podgląd i przesłanie plików formularza na serwer. W twoim przypadku musisz użyć Ajax, aby ułatwić przesyłanie pliku na serwer:
Przesyłane dane są danymi formularza. W jQuery użyj funkcji przesyłania formularza zamiast kliknięcia przycisku, aby przesłać plik formularza, jak pokazano poniżej.
Zobacz więcej szczegółów
źródło
Przykład: Jeśli używasz jQuery, możesz łatwo załadować plik. Jest to niewielka i silna wtyczka jQuery, http://jquery.malsup.com/form/ .
Przykład
Mam nadzieję, że byłoby to pomocne
źródło
Możesz użyć
Próbny
źródło
Konwersja plików do base64 korzystających | HTML5 za readAsDataURL () lub niektóre base64 enkoder . Fiddle tutaj
Następnie, aby pobrać:
źródło
Możesz przekazać dodatkowe parametry wraz z nazwą pliku podczas wykonywania asynchronicznego przesyłania za pomocą XMLHttpRequest (bez zależności flash i iframe). Dołącz wartość dodatkowego parametru do FormData i wyślij żądanie przesłania.
Ponadto przesyłanie pliku interfejsu JavaScript Syncfusion zapewnia rozwiązanie dla tego scenariusza po prostu za pomocą argumentu zdarzenia. dokumentację można znaleźć tutaj, a dalsze szczegóły na temat tej kontroli tutaj wprowadź opis linku tutaj
źródło
Poszukaj obsługi procesu przesyłania pliku, asynchronicznie tutaj: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Próbka z linku
źródło
To jest moje rozwiązanie.
i js
Kontroler
źródło
Używając HTML5 i JavaScript , przesyłanie asynchroniczne jest dość łatwe, tworzę logikę przesyłania razem z twoim HTML, to nie działa w pełni, ponieważ wymaga interfejsu API, ale zademonstruj, jak to działa, jeśli masz punkt końcowy wywoływany
/upload
z katalogu głównego witryny, ten kod powinien działać dla Ciebie:Również dodatkowe informacje na temat XMLHttpReques:
Aby uzyskać więcej informacji, możesz kontynuować czytanie tutaj ...
źródło
Możesz użyć nowszego Fetch API przez JavaScript. Lubię to:
Zaleta: Fetch API jest natywnie obsługiwany przez wszystkie nowoczesne przeglądarki, więc nie musisz niczego importować. Zauważ też, że funkcja fetch () zwraca obietnicę, która jest następnie obsługiwana przy użyciu
.then(..code to handle response..)
asynchronicznie.źródło
Możesz wykonać asynchroniczne przesyłanie wielu plików za pomocą JavaScript lub jQuery i to bez użycia żadnej wtyczki. Możesz również pokazać postęp przesyłania pliku w czasie rzeczywistym w kontrolce postępu. Znalazłem 2 fajne linki -
Językiem po stronie serwera jest C #, ale możesz wprowadzić pewne modyfikacje, aby działał z innym językiem, takim jak PHP.
Przesyłanie pliku ASP.NET Core MVC:
W widoku Utwórz kontrolkę przesyłania plików w HTML:
Teraz utwórz metodę działania w kontrolerze:
Zmienna hostEnvironment jest typu IHostingEnvironment, którą można wstrzykiwać do kontrolera za pomocą wstrzykiwania zależności, np .:
źródło
W przypadku PHP poszukaj https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
źródło
Możesz również rozważyć użycie czegoś takiego jak https://uppy.io .
Wykonuje przesyłanie plików bez opuszczania strony i oferuje kilka bonusów, takich jak przeciąganie i upuszczanie, wznawianie przesyłania w przypadku awarii przeglądarki / niestabilnych sieci oraz importowanie np. Z Instagrama. Jest to oprogramowanie typu open source i nie opiera się na jQuery / React / Angular / Vue, ale można z nim korzystać. Oświadczenie: jako twórca jestem stronniczy;)
źródło