Heim  >  Artikel  >  Web-Frontend  >  Node.js-Entwicklungs-Tutorial: Implementierung von Funktionen zum Hochladen und Verifizieren von Dateien basierend auf dem OnceIO-Framework

Node.js-Entwicklungs-Tutorial: Implementierung von Funktionen zum Hochladen und Verifizieren von Dateien basierend auf dem OnceIO-Framework

高洛峰
高洛峰Original
2016-12-03 13:36:011097Durchsuche

OnceIO ist das zugrunde liegende Web-Framework von OnceDoc Enterprise Content (Netzwerkfestplatte). Es erfordert überhaupt keine E/A-Vorgänge und unterstützt die Client-Cache-Optimierung (GZIP). Komprimierung usw. (nur beim ersten Mal komprimiert) bietet eine sehr gute Leistung, wodurch Sie Serverkosten sparen. Seine modulare Funktion ermöglicht die verteilte Speicherung Ihres Webs, d. h. ein Erweiterungspaket enthält Front-End-, Back-End- und Datenbankdefinitionen. Funktionen können einfach durch Hinzufügen/Löschen von Verzeichnissen gelöscht werden, wodurch eine echte modulare Erweiterung erreicht wird. Hier finden Sie eine Reihe von Artikeln, die die Verwendung von OnceIO vorstellen.

In diesem Kapitel zeigen wir, wie Sie OnceIO verwenden, um die Funktion zum Hochladen von Dateien zu implementieren.

Erstellen Sie ein Formular in einer Webseitendatei

Nehmen Sie als Beispiel eine einfache Webseitendatei.html, die nur über eine Datei-Upload-Funktion verfügt:

<!DOCTYPE html>
<html>
<body>
<form method="post" enctype="multipart/form-data" action="/file/upload">
<input type="file" name="file" /><br>
<input type="submit" value="Upload" />
</form>
</body>
</html>

Der Browser Der Anzeigeeffekt ist wie folgt:

Node.js-Entwicklungs-Tutorial: Implementierung von Funktionen zum Hochladen und Verifizieren von Dateien basierend auf dem OnceIO-Framework

Klicken Sie auf die leere Leiste oder auf die Schaltfläche „Durchsuchen...“, um das Fenster zum Durchsuchen von Dateien zu öffnen und wählen Sie die Datei aus, die hochgeladen werden soll:

Node.js-Entwicklungs-Tutorial: Implementierung von Funktionen zum Hochladen und Verifizieren von Dateien basierend auf dem OnceIO-Framework

Logik für die Empfangsdatei des Servers erstellen

Der Code der Serverdatei websvr.js sieht folgendermaßen aus:

var fs = require(&#39;fs&#39;)
var path = require(&#39;path&#39;)
var onceio = require(&#39;../onceio/onceio&#39;)
var app = onceio()
app.get(&#39;/&#39;, function(req, res){
res.render(&#39;file.html&#39;)
})
app.file(&#39;/file/upload&#39;, function(req, res) {
var fileInfo = req.files.file || {}
fs.link(fileInfo.path, path.join(&#39;./fileStore&#39;, fileInfo.name))
res.send(&#39;File Uploaded Successfully&#39;)
}).before(function(req, res) {
var contentLength = req.headers[&#39;content-length&#39;] || 0
if (contentLength > 1048576) {
res.send({ error: &#39;Error: File Size Limit (1 MB) Exceeded&#39; })
} else {
return true
}
})

var fs = require(' fs‘) und var path = require(‘path‘) Das von Node.js bereitgestellte Dateisystemmodul (fs) zum Betreiben von Dateien und das Pfadmodul zum Verarbeiten von Dateipfaden werden jeweils importiert.

app.file(path, callback).before(callback) entspricht app.use(path, callback, {file: true}).before(callback) und ist eine Middleware zur Verarbeitung hochgeladener Dateien.

Nachdem die Datei hochgeladen wurde, werden ihre Größe, Speicheradresse, Name, Format und Änderungszeit in das Dateiattribut von req.files eingefügt (der Name befindet sich im Eingabe-Tag vom Typ „Dateiname“). , seine Größeninformationen werden im Attribut content-length von req.headers platziert.

Before-Funktion

Before ist einer der Hauptunterschiede zwischen OnceIO und anderen Web-Frameworks. Es kann vor dem Empfang einige grundlegende Überprüfungen der Dateien durchführen, z. B. Größe, Typ usw., um die beste Leistung zu erzielen. Die Rückgabe „true“ gibt an, dass die Überprüfung erfolgreich war und die Datei empfangen wird. Andernfalls wird die Verbindung geschlossen und der Upload abgebrochen. Zuvor war das req.session-Objekt nicht verfügbar, da die Sitzung möglicherweise in einer Datei oder Datenbank-Redis vorhanden ist und das Abrufen der Sitzung ein asynchroner Prozess ist, der Zeit braucht. Die Vorher-Funktion muss sofort ein Urteil über die Rechtmäßigkeit der Datei fällen.

In diesem Beispiel bestimmt die Vorher-Rückruffunktion anhand der Inhaltslänge in req.headers, ob die hochgeladene Datei die Größenbeschränkung überschreitet (Entwickler können die Obergrenze der Datei-Upload-Größe ändern, indem sie die Konstante in ändern if-Anweisung, Inhalt: Die Längeneinheit ist Byte, 1024 * 1024 bedeutet 1 MB. Wenn sie größer ist, wird die Datei nicht hochgeladen, und der Server gibt eine Fehlermeldung zurück, wenn sie nicht überschritten wird wahr sein, und der Server führt weiterhin die Rückruffunktion in app.file aus. Übertragen Sie die Datei von der temporären Adresse an die angegebene Speicheradresse und laden Sie die Datei hier hoch, um sie abzuschließen.

Lösung des Problems doppelter Dateinamen

Unser aktuelles Serverprogramm kann das Problem doppelter Dateinamen nicht lösen. Wenn der Benutzer eine Datei mit demselben Namen hochlädt, gibt der Server eine Fehlermeldung zurück, dass die Datei bereits vorhanden ist. Um dieses Problem zu lösen, können wir einen Zeitstempel zwischen dem Hauptdateinamen und dem Erweiterungsnamen der Datei hinzufügen. Der Funktionscode für diese Verarbeitung lautet wie folgt:

var timestampName = function(fileName){
// get filename extension
var extName = path.extname(fileName) 
// get base name of the file
var baseName = path.basename(fileName, extName)
// insert timestamp between base name and filename extension
// the plus sign (&#39;+&#39;) before new Date() converts it into a number
return baseName + +new Date() + extName
}

Dann ersetzen Sie fileInfo.name in Ersetzen Sie die fs.link-Anweisung durch timestampName(fileInfo.name):

fs.link(fileInfo.path, path.join(&#39;./fileStore&#39;, timestampName(fileInfo.name)))

Das verbesserte Serverprogramm kann Benutzern das Hochladen von Dateien mit demselben Namen ermöglichen. Das Hochladen einer Datei mit dem Namen „cache_workflow.png“ dauert fünf Mal als Beispiel. Der Server wird 5 Dateien haben, deren Namen mit „cache_workflow“ beginnen, aber unterschiedliche Zeitstempel in der Dateispeicheradresse haben:


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn