Ich möchte eine Datei asynchron mit jQuery hochladen.
$(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"/>
Anstatt die Datei hochzuladen, erhalte ich nur den Dateinamen. Was kann ich tun, um dieses Problem zu beheben?
javascript
jquery
ajax
asynchronous
xmlhttprequest
Sergio del Amo
quelle
quelle
Antworten:
Mit HTML5 können Sie mit Ajax und jQuery Datei-Uploads durchführen. Darüber hinaus können Sie Dateiüberprüfungen (Name, Größe und MIME-Typ) durchführen oder das Fortschrittsereignis mit dem HTML5-Fortschritts-Tag (oder einem div) behandeln. Vor kurzem musste ich einen Datei-Uploader erstellen, wollte aber kein Flash verwenden noch Iframes oder Plugins verwenden, und nach einigen Recherchen kam ich auf die Lösung.
Der HTML:
Zunächst können Sie eine Validierung durchführen, wenn Sie möchten. Zum Beispiel im
.on('change')
Fall der Datei:Nun das
$.ajax()
Senden mit dem Klick der Schaltfläche:Wie Sie sehen können, wird das Hochladen von HTML5-Dateien (und einigen Recherchen) nicht nur möglich, sondern auch sehr einfach. Probieren Sie es mit Google Chrome aus, da einige der HTML5-Komponenten der Beispiele nicht in jedem Browser verfügbar sind.
quelle
name="file"
ist sehr wichtig für das<input>
Datei-Tag, wenn Sie die Daten in PHP (und wahrscheinlich an anderen Orten) verwenden möchten. Ich habe ein Formular dynamisch mit Javascript erstellt, sodass ich das Namensattribut nicht benötigte, aber herausgefunden habe, auf welche harte Weise Sie es unbedingt benötigen, um die Datenserverseite abzurufen.Update 2019: Dies hängt immer noch von den Browsern ab, die Ihre demografische Gruppe verwendet.
Eine wichtige Sache, die Sie mit der "neuen" HTML5-
file
API verstehen sollten, ist, dass sie erst in IE 10 unterstützt wurde . Wenn der von Ihnen angestrebte spezifische Markt eine überdurchschnittliche Neigung zu älteren Windows-Versionen aufweist, haben Sie möglicherweise keinen Zugriff darauf.Ab 2017 sind etwa 5% der Browser IE 6, 7, 8 oder 9. Wenn Sie in ein großes Unternehmen eintreten (z. B. ein B2B-Tool oder etwas, das Sie für Schulungen bereitstellen), kann diese Zahl in die Höhe schnellen . 2016 habe ich mich mit einem Unternehmen befasst, das IE8 auf über 60% seiner Maschinen verwendet.
Es ist 2019 ab dieser Bearbeitung, fast 11 Jahre nach meiner ersten Antwort. IE9 und niedriger sind global um die 1% -Marke, aber es gibt immer noch Cluster mit höherer Nutzung.
Das Wichtigste dabei ist, unabhängig von der Funktion, zu überprüfen, welchen Browser Ihre Benutzer verwenden . Wenn Sie dies nicht tun, lernen Sie schnell und schmerzhaft, warum "funktioniert für mich" nicht gut genug ist, um einem Kunden etwas zu liefern. caniuse ist ein nützliches Werkzeug, aber beachten Sie, woher sie ihre Demografie beziehen . Sie stimmen möglicherweise nicht mit Ihren überein. Dies ist niemals wahrer als in Unternehmensumgebungen.
Meine Antwort von 2008 folgt.
Es gibt jedoch praktikable Nicht-JS-Methoden zum Hochladen von Dateien. Sie können einen Iframe auf der Seite erstellen (die Sie mit CSS ausblenden) und dann Ihr Formular so ausrichten, dass es auf diesem Iframe veröffentlicht wird. Die Hauptseite muss nicht verschoben werden.
Es ist ein "echter" Beitrag, daher ist er nicht vollständig interaktiv. Wenn Sie Status benötigen, benötigen Sie etwas Server-seitiges, um dies zu verarbeiten. Dies ist je nach Server sehr unterschiedlich. ASP.NET hat schönere Mechanismen. PHP Plain schlägt fehl, aber Sie können Perl- oder Apache-Modifikationen verwenden, um es zu umgehen.
Wenn Sie mehrere Datei-Uploads benötigen, ist es am besten, jede Datei einzeln auszuführen (um die maximalen Limits für das Hochladen von Dateien zu überwinden). Veröffentlichen Sie das erste Formular im Iframe, überwachen Sie den Fortschritt anhand der oben genannten Informationen. Wenn es fertig ist, senden Sie das zweite Formular in den Iframe und so weiter.
Oder verwenden Sie eine Java / Flash-Lösung. Sie sind viel flexibler in dem, was sie mit ihren Posts machen können ...
quelle
Ich empfehle zu diesem Zweck das Fine Uploader Plugin. Ihr
JavaScript
Code wäre:quelle
Hinweis: Diese Antwort ist veraltet. Es ist jetzt möglich, Dateien mit XHR hochzuladen.
Sie können keine Dateien mit XMLHttpRequest (Ajax) hochladen . Sie können den Effekt mit einem Iframe oder Flash simulieren. Das ausgezeichnete jQuery Form Plugin , das Ihre Dateien über einen Iframe veröffentlicht, um den Effekt zu erzielen.
quelle
Zusammenfassung für zukünftige Leser.
Asynchrones Hochladen von Dateien
Mit HTML5
Sie können Dateien mit jQuery mithilfe der
$.ajax()
Methode hochladen , wenn FormData und die Datei-API unterstützt werden (beide HTML5-Funktionen).Sie können Dateien auch ohne FormData senden. In beiden Fällen muss jedoch die Datei-API vorhanden sein, damit Dateien so verarbeitet werden können, dass sie mit XMLHttpRequest (Ajax) gesendet werden können .
Ein schnelles, reines JavaScript-Beispiel ( kein jQuery ) finden Sie unter " Senden von Dateien mit einem FormData-Objekt ".
Zurückfallen
Wenn HTML5 nicht unterstützt wird (keine Datei-API ), ist die einzige andere reine JavaScript-Lösung (kein Flash oder ein anderes Browser-Plugin) die versteckte Iframe- Technik, mit der eine asynchrone Anforderung ohne Verwendung des XMLHttpRequest- Objekts emuliert werden kann.
Es besteht darin, einen Iframe als Ziel des Formulars mit den Dateieingaben festzulegen. Wenn der Benutzer eine Anfrage sendet, werden die Dateien hochgeladen, aber die Antwort wird im Iframe angezeigt, anstatt die Hauptseite erneut zu rendern. Durch das Ausblenden des Iframes wird der gesamte Prozess für den Benutzer transparent und eine asynchrone Anforderung emuliert.
Wenn es richtig gemacht wird, sollte es praktisch in jedem Browser funktionieren, aber es gibt einige Einschränkungen, wie man die Antwort vom Iframe erhält.
In diesem Fall können Sie es vorziehen ein Wrapper - Plugin wie verwenden Bifröst die die verwendet iframe - Technik , sondern bietet auch einen Transport jQuery Ajax ermöglicht zu Dateien senden nur mit dem
$.ajax()
Verfahren wie folgt aus :Plugins
Bifröst ist nur ein kleiner Wrapper, der die Ajax-Methode von jQuery um Fallback-Unterstützung erweitert. Viele der oben genannten Plugins wie das jQuery Form Plugin oder das Hochladen von jQuery-Dateien enthalten jedoch den gesamten Stapel von HTML5 zu verschiedenen Fallbacks und einige nützliche Funktionen, um den Prozess zu vereinfachen. Abhängig von Ihren Anforderungen und Anforderungen möchten Sie möglicherweise eine reine Implementierung oder eines dieser Plugins in Betracht ziehen.
quelle
contentType: false
. Wenn ich dies nicht mit Chrome gesendet habe, wurde der Formularinhaltstyp von jQuery ungültig gemacht..done()
und.fail()
Rückrufe. Auch ein Beispiel ohne die Verwendung vonFormData
und eine Liste von Vor- und Nachteilen wäre fantastisch.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Dieses jQuery-Plugin zum Hochladen von AJAX-Dateien lädt die Datei irgendwo hoch und leitet die Antwort an einen Rückruf weiter, sonst nichts.
<input type="file">
- Verwenden Sie so wenig wie -
- oder so viel wie -
quelle
Ich habe das folgende Skript verwendet, um Bilder hochzuladen, was zufällig gut funktioniert.
HTML
JavaScript
Erläuterung
Ich verwende die Antwort
div
, um die Upload-Animation und die Antwort nach dem Hochladen anzuzeigen.Das Beste daran ist, dass Sie zusätzliche Daten wie IDs usw. mit der Datei senden können, wenn Sie dieses Skript verwenden. Ich habe es
extra-data
wie im Drehbuch erwähnt.Auf PHP-Ebene funktioniert dies wie beim normalen Hochladen von Dateien. Zusätzliche Daten können als
$_POST
Daten abgerufen werden.Hier benutzt du kein Plugin und so. Sie können den Code beliebig ändern. Sie codieren hier nicht blind. Dies ist die Kernfunktionalität jedes Hochladens von jQuery-Dateien. Eigentlich Javascript.
quelle
addEventListener
ist nicht browserübergreifend.Sie können es ziemlich einfach in Vanille-JavaScript tun. Hier ist ein Ausschnitt aus meinem aktuellen Projekt:
quelle
ondrop
Veranstaltung tunvar file = e.dataTransfer.files[0]
Sie können einfach mit jQuery hochladen
.ajax()
.HTML:
CSS
Javascript:
quelle
Der einfachste und robusteste Weg, den ich in der Vergangenheit gemacht habe, besteht darin, einfach ein verstecktes iFrame-Tag mit Ihrem Formular anzuvisieren. Anschließend wird es innerhalb des Iframes gesendet, ohne die Seite neu zu laden.
Das ist, wenn Sie kein Plugin, JavaScript oder andere Formen von "Magie" außer HTML verwenden möchten. Natürlich können Sie dies mit JavaScript kombinieren oder was haben Sie ...
Sie können auch den Inhalt des Iframes
onLoad
auf Serverfehler oder Erfolgsantworten lesen und diesen dann an den Benutzer ausgeben.Chrome, iFrames und onLoad
-note- Sie müssen nur weiterlesen, wenn Sie daran interessiert sind, wie Sie beim Hochladen / Herunterladen einen UI-Blocker einrichten
Derzeit löst Chrome das onLoad-Ereignis für den Iframe nicht aus, wenn es zum Übertragen von Dateien verwendet wird. Firefox, IE und Edge lösen alle das Onload-Ereignis für Dateiübertragungen aus.
Die einzige Lösung, die ich für Chrome gefunden habe, war die Verwendung eines Cookies.
Um dies im Grunde zu tun, wenn der Upload / Download gestartet wird:
Die Verwendung eines Cookies ist hässlich, funktioniert aber.
Ich habe ein jQuery-Plugin erstellt, um dieses Problem für Chrome beim Herunterladen zu beheben. Sie finden es hier
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
Das gleiche Grundprinzip gilt auch für das Hochladen.
So verwenden Sie den Downloader (natürlich auch den JS)
Erstellen Sie auf der Serverseite kurz vor dem Übertragen der Dateidaten das Cookie
Das Plugin sieht das Cookie und löst dann den
onComplete
Rückruf aus.quelle
Eine Lösung, die ich gefunden habe, war, dem
<form>
Ziel einen versteckten iFrame zu geben. Der iFrame kann dann JS ausführen, um dem Benutzer anzuzeigen, dass er vollständig ist (beim Laden der Seite).quelle
Ich habe dies in einer Rails-Umgebung geschrieben . Es sind nur etwa fünf Zeilen JavaScript, wenn Sie das leichtgewichtige jQuery-Formular-Plugin verwenden.
Die Herausforderung besteht darin, den AJAX-Upload zum Laufen zu bringen, da der Standard
remote_form_for
das Übermitteln mehrteiliger Formulare nicht versteht. Die Dateidaten, die Rails mit der AJAX-Anforderung sucht, werden nicht gesendet.Hier kommt das jQuery-Form-Plugin ins Spiel.
Hier ist der Rails-Code dafür:
Hier ist das zugehörige JavaScript:
Und hier ist die Rails-Controller-Aktion, hübsche Vanille:
Ich habe dies in den letzten Wochen mit Bloggity verwendet und es hat wie ein Champion funktioniert.
quelle
Simple Ajax Uploader ist eine weitere Option:
https://github.com/LPology/Simple-Ajax-Uploader
Anwendungsbeispiel:
quelle
IE7+
! Probieren Sie es jetzt aus. Vielen DankjQuery Uploadify ist ein weiteres gutes Plugin, mit dem ich zuvor Dateien hochgeladen habe. Der JavaScript-Code ist so einfach wie der folgende: Code. Die neue Version funktioniert jedoch nicht in Internet Explorer.
Ich habe viel gesucht und bin zu einer anderen Lösung für das Hochladen von Dateien ohne Plugin und nur mit Ajax gekommen. Die Lösung ist wie folgt:
quelle
Hier ist nur eine weitere Lösung zum Hochladen von Dateien ( ohne Plugin) ).
Verwenden einfacher Javascripts und AJAX (mit Fortschrittsbalken)
HTML-Teil
JS Teil
PHP-Teil
Hier ist die BEISPIEL-Anwendung
quelle
Sie können Formulardaten verwenden, um alle Ihre Werte einschließlich Bilder zu veröffentlichen.
quelle
cache: false
Ist bei einerPOST
Anforderung redundant, daPOST
niemals zwischengespeichert wird.TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement.
Führen Sie die folgenden Schritte aus, um eine Datei asynchron mit Jquery hochzuladen:
Schritt 1 Öffnen Sie in Ihrem Projekt den Nuget-Manager und fügen Sie ein Paket hinzu (jquery fileupload (nur Sie müssen es in das Suchfeld schreiben, es wird angezeigt)) URL: https://github.com/blueimp/jQuery-File- Hochladen
Schritt 2 Fügen Sie die folgenden Skripte in die HTML-Dateien ein, die dem Projekt bereits hinzugefügt wurden, indem Sie das obige Paket ausführen:
Schritt 3 Schreiben Sie die Steuerung zum Hochladen von Dateien gemäß dem folgenden Code:
Schritt 4 Schreiben Sie eine js-Methode als uploadFile wie folgt:
Schritt 5 Laden Sie beim Hochladen der Elementdatei die fertige Funktion auf, um den Vorgang wie folgt zu starten:
Schritt 6 Schreiben Sie den MVC-Controller und die Aktion wie folgt:
quelle
Ein moderner Ansatz ohne Jquery besteht darin, das FileList- Objekt zu verwenden, von dem Sie zurückkommen,
<input type="file">
wenn der Benutzer eine Datei auswählt, und dann mit Fetch die um ein FormData- Objekt gewickelte FileList zu veröffentlichen .quelle
Sie können eine Lösung gelöst mit einem Arbeits Demo sehen hier , dass Sie Formulardateien an den Server , um eine Vorschau und senden kann. In Ihrem Fall müssen Sie Ajax verwenden , um das Hochladen von Dateien auf den Server zu erleichtern:
Die übermittelten Daten sind Formulardaten. Verwenden Sie in Ihrer jQuery eine Formularübermittlungsfunktion anstelle eines Schaltflächenklicks, um die Formulardatei wie unten gezeigt zu senden.
Weitere Details anzeigen
quelle
Beispiel: Wenn Sie jQuery verwenden, können Sie eine Upload-Datei einfach bearbeiten. Dies ist ein kleines und starkes jQuery-Plugin, http://jquery.malsup.com/form/ .
Beispiel
Ich hoffe es wäre hilfreich
quelle
Sie können verwenden
Demo
quelle
Konvertieren Sie die Datei mit readAsDataURL () von | HTML5 oder einem Base64-Encoder in base64 . Geige hier
Dann abrufen:
quelle
Sie können zusätzliche Parameter zusammen mit dem Dateinamen beim asynchronen Hochladen mit XMLHttpRequest übergeben (ohne Flash- und Iframe-Abhängigkeit). Fügen Sie den zusätzlichen Parameterwert mit FormData hinzu und senden Sie die Upload-Anforderung.
Außerdem bietet das Hochladen von JavaScript-UI-Dateien von Syncfusion eine Lösung für dieses Szenario, indem einfach ein Ereignisargument verwendet wird. Dokumentation finden Sie hier und weitere Details zu diesem Steuerelement finden Sie hier
quelle
Suchen Sie hier nach der asynchronen Behandlung des Upload-Vorgangs für eine Datei : https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
Beispiel aus dem Link
quelle
Das ist meine Lösung.
und die js
Regler
quelle
Mit HTML5 und JavaScript ist das Hochladen von Async recht einfach. Ich erstelle die Upload-Logik zusammen mit Ihrem HTML-Code. Dies funktioniert nicht vollständig, da die API benötigt wird. Zeigen Sie jedoch, wie es funktioniert, wenn Sie den Endpunkt
/upload
aus dem Stammverzeichnis Ihrer Website aufgerufen haben. Dieser Code sollte für Sie funktionieren:Auch einige weitere Informationen zu XMLHttpReques:
Für weitere Details können Sie hier weiterlesen ...
quelle
Sie können eine neuere Fetch-API mit JavaScript verwenden. So was:
Vorteil: Die Fetch-API wird von allen modernen Browsern nativ unterstützt , sodass Sie nichts importieren müssen. Beachten Sie außerdem, dass fetch () ein Versprechen zurückgibt, das dann
.then(..code to handle response..)
asynchron verwendet wird.quelle
Sie können die asynchronen Uploads mehrerer Dateien mit JavaScript oder jQuery durchführen, ohne ein Plugin zu verwenden. Sie können den Echtzeitfortschritt des Datei-Uploads auch in der Fortschrittskontrolle anzeigen. Ich bin auf 2 nette Links gestoßen -
Die serverseitige Sprache ist C #, aber Sie können einige Änderungen vornehmen, damit sie mit einer anderen Sprache wie PHP funktioniert.
Datei-Upload ASP.NET Core MVC:
In der Ansicht Steuerelement zum Hochladen von Dateien in HTML erstellen:
Erstellen Sie nun eine Aktionsmethode in Ihrem Controller:
Die Variable hostingEnvironment ist vom Typ IHostingEnvironment, die mithilfe der Abhängigkeitsinjektion in den Controller injiziert werden kann, z.
quelle
Suchen Sie für PHP nach https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
JAVASCRIPT
PHP
quelle
Sie können auch https://uppy.io verwenden .
Es lädt Dateien hoch, ohne von der Seite weg zu navigieren, und bietet einige Boni wie Drag & Drop, Fortsetzen des Uploads bei Browserabstürzen / flockigen Netzwerken und Importieren von z. B. Instagram. Es ist Open Source und basiert nicht auf jQuery / React / Angular / Vue, kann aber damit verwendet werden. Haftungsausschluss: Als Schöpfer bin ich voreingenommen;)
quelle