Ich verwende Node v0.10.26 und Express v4.2.0 und bin ziemlich neu in Node. Ich habe in den letzten drei Stunden meinen Kopf gegen meinen Schreibtisch geschlagen und versucht, ein Formular zum Hochladen von Dateien mit Node zum Laufen zu bringen. An dieser Stelle versuche ich nur, req.files dazu zu bringen, nicht undefiniert zurückzugeben. Meine Ansicht sieht so aus
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>{{ title }}</h1>
<p>Welcome to {{ title }}</p>
<form method='post' action='upload' enctype="multipart/form-data">
<input type='file' name='fileUploaded'>
<input type='submit'>
</form>
</body>
</html>
Hier sind meine Routen
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.post('/upload', function(req, res){
console.log(req.files);
});
module.exports = router;
Und hier ist meine app.js.
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hjs');
app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
/// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
/// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
Ich habe irgendwo gesehen, dass einschließlich methodOverride()
und bodyParser({keepExtensions:true,uploadDir:path})
sollte helfen, aber ich kann meinen Server nicht einmal starten, wenn ich diese Zeilen hinzufüge.
node.js
file-upload
express
okawei
quelle
quelle
formidable
undexpress
. AFAIK müssen Sie aktivieren,formiable
das die Verantwortung für den Umgang mit mehrteiligen Formulardaten übernimmt, die Dateien auf der lokalen Festplatte speichert (was dasuploadDir
Mittel ist), dann können Sie sie verwendenreq.files
, um sie zu lesen und Ihre Geschäftslogik zu verarbeiten.app.use(express.static(path.join(__dirname, 'public')));
Antworten:
ExpressJS-Problem:
Der größte Teil der Middleware wird aus Express 4 entfernt. Check out: http://www.github.com/senchalabs/connect#middleware Für mehrteilige Middleware wie Busboy, Busboy-Connect, Formidable, Flow, Parted wird benötigt.
In diesem Beispiel wird die Connect-Busboy- Middleware verwendet. Erstelle / img und / öffentliche Ordner.
Verwenden Sie die Ordnerstruktur:
\ server.js
\ img \ "wo Sachen hochgeladen werden"
\ public \ index.html
SERVER.JS
INDEX.HTML
Das Folgende funktioniert mit beeindruckendem SERVER.JS
quelle
Eine andere Möglichkeit ist die Verwendung von Multer , bei dem Busboy unter der Haube verwendet wird, der jedoch einfacher einzurichten ist.
Verwenden Sie multer und legen Sie das Ziel für den Upload fest:
Erstellen Sie ein Formular in Ihrer Ansicht,
enctype='multipart/form-data
damit Multer funktioniert:Dann können Sie in Ihrem POST auf die Daten über die Datei zugreifen:
Ein vollständiges Tutorial dazu finden Sie hier .
quelle
unknown field
Fehlern frustriert bin . Alles in meinem Code ist korrekt. Es funktioniert die meiste Zeit und zeigt dann auf mysteriöse Weise diese Ausnahme, wobei alles gleich bleibt (Umgebung, Datei, Code, Dateiname)app.use
`` `var upload = multer ({dest: 'uploads /'}) haben. var app = express () app.post ('/ profile', upload.single ('Feldname'), Funktion (req, res, next) {console.log (req.file);}) `` `Hier ist eine vereinfachte Version ( das Wesentliche ) von Mick Cullens Antwort - teilweise um zu beweisen, dass es nicht sehr komplex sein muss, dies umzusetzen; Zum Teil, um eine Kurzreferenz für alle zu geben, die nicht daran interessiert sind, Seiten und Codeseiten zu lesen.
Sie müssen Ihre App dazu bringen, Connect-Busboy zu verwenden :
Dies wird nichts tun, bis Sie es auslösen. Gehen Sie in dem Aufruf, der das Hochladen übernimmt, wie folgt vor:
Lassen Sie uns das zusammenfassen:
req.busboy
eingestellt ist (die Middleware wurde korrekt geladen)"file"
Listener eingerichtetreq.busboy
req
anreq.busboy
Im Datei-Listener gibt es einige interessante Dinge, aber was wirklich wichtig ist,
fileStream
ist Folgendes : Dies ist eine lesbare Datei, die dann wie gewohnt in eine Datei geschrieben werden kann.Fallstricke: Sie müssen mit Readable umgehen, da Express sonst niemals auf die Anfrage reagiert (siehe Busboy-API ( Dateibereich )).
quelle
Ich finde das einfach und effizient:
Express-Datei hochladen
quelle
Ich musste etwas detaillierter durchgehen als die anderen Antworten (z. B. wie schreibe ich die Datei an einen Ort, den ich zur Laufzeit festgelegt habe?). Hoffentlich hilft dies anderen:
Holen Sie sich Connect-Busboy:
Fügen Sie in Ihrer server.js diese Zeilen hinzu
Dies scheint jedoch die Fehlerbehandlung zu unterlassen ... wird bearbeitet, wenn ich es finde.
quelle
Multer ist eine node.js-Middleware für den Umgang mit mehrteiligen / Formulardaten, die hauptsächlich zum Hochladen von Dateien verwendet wird. Es ist für maximale Effizienz auf den Busboy geschrieben.
quelle
Hier ist ein einfacher Weg, der für mich funktioniert hat:
quelle
Persönlich hat multer nach Wochen, in denen ich versucht habe, diese Datei hochzuladen, nicht für mich funktioniert. Dann wechsle ich zu formidable und nach ein paar Tagen habe ich es perfekt ohne Fehler zum Laufen gebracht, mehrere Dateien, express und react.js, obwohl react optional ist. Hier ist die Anleitung: https://www.youtube.com/watch?v=jtCfvuMRsxE&t=122s
quelle
Wenn Sie Node.js Express verwenden und Typescript hier ein funktionierendes Beispiel ist, funktioniert dies auch mit Javascript. Ändern Sie einfach let in var und import in include etc ...
Importieren Sie zuerst Folgendes: Stellen Sie sicher, dass Sie formidable installieren, indem Sie den folgenden Befehl ausführen:
als importieren Sie die folgenden:
dann deine Funktion wie unten:
quelle