NodeJS verarbeitet das Datei -Upload
In Express4 wurde Req.files undefined ; Die am häufigsten verwendete, kann jetzt formidable sein. Sie wissen, dass es ein progress gibt, also sind Sie überglücklich. Die Fortschrittsleiste der unteren Version des IE ist eine Chance; Ok, probier es aus:
Formular .on ('Fehler', Funktion (err) {console.log (err);}) .on ('abgebrochen', function () {console.log ('abgebrochen');}) .on ('Fortschritt', Funktion (BytesReced, bytesexpection) {var N = ParseInt (Parsefloat (ByteReced/Bytesexpecus) .Tofixed (2)*100);Ja, Sie sind froh zu sehen, dass die Konsole eine Reihe von Fortschrittswerten wie erwartet druckt. dann weiter gehen;
Form .on ('Progress', Funktion (ByteReced, bytesexpected) {var n = parseInt (Parsefloat (ByteReced/bytesexpected) .tofixed (2)*100); Die call soll den Fortschrittswert auf der Seite angezeigt werden. Leider können Sie nur die letzten 100%sehen, und Sie können den spezifischen detaillierten Fortschrittswert nicht sehen. Wieder erkunden ...
Ändern wir als nächstes die Idee, versuchen Sie es, speichern Sie den Fortschrittswert für session und fügen Sie eine zusätzliche Anfrage hinzu, um den Fortschrittswert zu befragen. Oh, es ist nicht schlecht! Um sicherzustellen, dass der von Ihnen angeforderte Fortschrittswert der Fortschrittswert ist, den Sie dieses Mal hochladen, und nicht der Fortschrittswert anderer Uploads, müssen Sie in der hochgeladenen Anforderung und in der zusätzlichen Anfrage einen token -Wert zustimmen. Eine weitere Frage ist, wie man dieses token bei Anfrage bekommt. Da sich der Anforderungsgremium des Datei -Uploads in Request Payload befindet, kann req.body den von ihm erhöhten Wert nicht erhalten, und ich möchte diesen Stapel nicht analysieren, natürlich kann ich ihn natürlich auch nicht analysieren. Es ist am besten, es in url zu stecken. Das Problem ist, dass man manchmal zweimal erfrischen muss, um token zu aktualisieren, was nicht gut ist! Als letztes Ausweg werde ich es in cookie legen!
var cookies = function () {var cks = req.Headers.cookie.split (';'), obj = {}; für (var i = 0; i <cks.length; i ++) {obj [cks [i] .Split ('=') [0] .Replace (// s+/ig, '')] = unabschließt (cks [i] .split ('=') [1]); } return obj; } (); var queryToken = Cookies .__ Token__; Form .on ('Progress', Funktion (byteReced, bytesexpected) {var n = parseInt (parsefloat (Form.BytesRecebed/Form.ByteSexpect) .Tofixed (2)*100); Req.Session ['Datei'+QueryToken] = {Token: QueryToken, Prozent: n}};Für IE789 kam ich zur Umfrage für den Fortschrittswert. Vergib mir, mein Herz war eigentlich sehr schmerzhaft;
var getData = function () {$ .post ('/uploader', {getFileInfo: 1, UploadToken: utils.cookie.getcookie ('__ token__')} .Then (function (data) {console.log (data); if (data.mes <0) {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{) (GetData (); call (pros.percent); } getData (); Die call soll den Fortschrittswert auf der Seite angezeigt werden. Leider können Sie nur die letzten 100%sehen, und Sie können den spezifischen detaillierten Fortschrittswert nicht sehen. Wieder erkunden ...
Okay, ich bin wieder hineingefallen; Aber ich habe immer noch das Gefühl, dass etwas nicht stimmt, es gibt kein Problem mit Ajax -Umfragen. Das Problem ist, dass session warten muss, bis das Upload abgeschlossen ist, bevor sie einen Wert hat, sodass ich nur 100%sehen kann, und ich kann den detaillierten Fortschrittswert nicht sehen. Kann ich denken, dass die vorherige res.write und diese req.session ausgesetzt wurden, aber sie speichert die Ergebnisse jeder Ausführung, bis progress veröffentlicht wird, sodass ich nur 100%sehen kann. Ich bin nicht in der Stimmung, den Quellcode von formidable Fördercode zu lesen, natürlich kann ich es nicht verstehen, also denke ich das zuerst!
Da ajax -Umfragen in Ordnung sind, ist es nicht einfach, sie für session zu speichern. Wenn es wirklich nicht funktioniert, probieren Sie es in global aus. Es wird nicht in der Lage sein, einen Wert in das globale Objekt zu stecken und es wird es hängen. Wenn es eine geringfügige Veränderung vorliegt, wird es in globaler Weise in global gestellt:
Form .on ('Progress', Funktion (byteReced, bytesexpected) {var n = parseInt (parsefloat (Form.BytesRecebed/Form.ByteSexpect) .Tofixed (2)*100); Global ['Datei'+QueryToken] = {Token: QueryToken, Prozent: n}};Wühren Sie fort.
Schön, das ist alles! Was ich in Chrome sehe, ist der gleiche wie der Fortschritt von HTML5, aber es wird sich in IE789 ein wenig anfühlen, aber Sie können immer noch den detaillierten Fortschrittswert sehen. Immerhin sind alte Browser nicht gut, wissen Sie; Und jedes Mal, wenn Sie hochladen, geben Sie den Wert in global ein, sodass Sie ihn angemessen aufräumen müssen. Nachdem die Datei hochgeladen wurde, können Sie sie in das angegebene Verzeichnis global['file'+queryToken]=null übertragen;
Umfragen bedeutet jedoch viele Anfragen nacheinander, und hier kann es Probleme geben. Wenn Sie es nicht einschränken, wird der Fortschrittswert einmal alle 500 -ms -Intervall angefordert. Nun, die IE789 -Fortschrittsleiste ist so gelöst, und es ist vereinbart, Blitz wegzuwerfen. Obwohl diese Umfrage mit allen Browsern kompatibel ist, ist sie immer noch eine Verschwendung von so vielen Anfragen. Lassen Sie uns ein Urteil fällen, html5 außerhalb von IE789 fortsetzen!
Wenn Sie es messen, welches ist tatsächlich wertvoller, plus ein Flash -Upload oder eine zusätzliche Anfrage? Vergib mir, dass ich Flash nicht verstanden habe, ich werde nicht viel sagen. Wie auch immer, ich möchte der Seite keine zusätzlichen Dateien hinzufügen.
Zusammenfassen
Es gibt noch viele Details zu den Datei -Upload -Komponenten. Ich wollte ursprünglich eine JS -Datei erstellen, aber später dachte ich, dass es besser wäre, sie als unabhängige Seite zu tun, um wiederverwendbarer zu sein. Wenn Sie es hochladen müssen, iPrame es nur, was definitiv viel besser ist, als eine JS -Datei zu erstellen. Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es kann Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.