J'utilise node v0.10.26 et express v4.2.0 et je suis assez nouveau dans node. Je me cogne la tête contre mon bureau depuis environ trois heures pour essayer de faire fonctionner un formulaire de téléchargement de fichiers avec node. À ce stade, j'essaie simplement de faire en sorte que req.files ne retourne pas undefined. Ma vue ressemble à ceci
<!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>
Voici mes itinéraires
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;
Et voici mon 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;
J'ai vu quelque part cela incluant methodOverride()
et bodyParser({keepExtensions:true,uploadDir:path})
était censé aider mais je ne peux même pas lancer mon serveur si j'ajoute ces lignes.
node.js
file-upload
express
okawei
la source
la source
formidable
etexpress
. AFAIK vous devez activerformiable
ce qui prend la responsabilité de traiter les données de formulaire en plusieurs parties , enregistrez les fichiers sur le disque local (ce qui est leuploadDir
moyen), puis vous pouvez utiliser quelque chose commereq.files
pour les lire et traiter votre logique métier.app.use(express.static(path.join(__dirname, 'public')));
Réponses:
Problème ExpressJS:
La plupart des middlewares sont supprimés d'Express 4. Vérifiez: http://www.github.com/senchalabs/connect#middleware Pour les middlewares en plusieurs parties comme busboy, busboy-connect, formidable, flow, parted est nécessaire.
Cet exemple fonctionne avec le middleware connect-busboy . créer des dossiers / img et / public.
Utilisez la structure des dossiers:
\ server.js
\ img \ "où les éléments sont téléchargés vers"
\ public \ index.html
SERVER.JS
INDEX.HTML
Ce qui suit fonctionnera avec le formidable SERVER.JS
la source
Une autre option consiste à utiliser multer , qui utilise busboy sous le capot, mais qui est plus simple à installer.
Utilisez multer et définissez la destination du téléchargement:
Créer un formulaire dans votre vue,
enctype='multipart/form-data
est nécessaire pour que multer fonctionne:Ensuite, dans votre POST, vous pouvez accéder aux données sur le fichier:
Un tutoriel complet à ce sujet peut être trouvé ici .
la source
unknown field
erreur. Tout dans mon code est correct. Cela fonctionne la plupart du temps puis montre mystérieusement cette exception avec tout restant identique (environnement, fichier, code, nom de fichier)app.use
`` `` var upload = multer ({dest: 'uploads /'}); var app = express () app.post ('/ profile', upload.single ('field-name'), function (req, res, next) {console.log (req.file);}) `` `Voici une version simplifiée ( l'essentiel ) de la réponse de Mick Cullen - en partie pour prouver que cela n'a pas besoin d'être très complexe pour implémenter cela; en partie pour donner une référence rapide à quiconque n'est pas intéressé par la lecture de pages et de pages de code.
Vous devez faire en sorte que votre application utilise connect-busboy :
Cela ne fera rien tant que vous ne le déclencherez pas. Dans l'appel qui gère le téléchargement, procédez comme suit:
Décomposons ceci:
req.busboy
est défini (le middleware a été chargé correctement)"file"
auditeur surreq.busboy
req
lareq.busboy
À l'intérieur de l'écouteur de fichiers, il y a quelques choses intéressantes, mais ce qui compte vraiment, c'est
fileStream
: c'est un fichier lisible , qui peut ensuite être écrit dans un fichier, comme vous le feriez habituellement.Piège: Vous devez gérer ce Readable, sinon express ne répondra jamais à la demande , voir l'API busboy ( section fichier ).
la source
Je trouve cela simple et efficace:
express-fileupload
la source
J'avais besoin d'être exploré avec un peu plus de détails que les autres réponses fournies (par exemple, comment écrire le fichier à un emplacement que je décide lors de l'exécution?). J'espère que cela aidera les autres:
obtenir connect-busboy:
Dans votre server.js, ajoutez ces lignes
Cela semblerait cependant omettre la gestion des erreurs ... le modifiera si je le trouve.
la source
Multer est un middleware node.js pour la gestion de multipart / form-data, qui est principalement utilisé pour télécharger des fichiers. Il est écrit sur le busboy pour une efficacité maximale.
la source
Voici un moyen plus simple qui a fonctionné pour moi:
la source
Personnellement, multer n'a pas fonctionné pour moi après des semaines à essayer de faire correctement ce téléchargement de fichiers. Ensuite, je passe à formidable et après quelques jours je l'ai fait fonctionner parfaitement sans aucune erreur, plusieurs fichiers, express et react.js même si react est facultatif. Voici le guide: https://www.youtube.com/watch?v=jtCfvuMRsxE&t=122s
la source
Si vous utilisez Node.js Express et Typescript, voici un exemple de travail, cela fonctionne également avec javascript, changez simplement le let en var et l'importation en includes etc ...
importez d'abord les éléments suivants, assurez-vous d'installer formidable en exécutant la commande suivante:
que d'importer ce qui suit:
alors votre fonction comme ci-dessous:
la source