2017-12-15 1 views
0

Ich bin neu bei Node JS, so Dinge sind nicht leicht zu mir kommen. Das Szenario ist Ich habe Eingabefeld, das mehrere Dateien akzeptiert.NodeJS: kann nicht nach Anfrage Textfeld posten

<input id="upload-input" type="file" name="uploads[]" multiple="multiple"> 

in meinem JS Skript packe ich das das Änderungsereignis dieses Feldes, und erstellen, um meine Uploader App eine Post-Anforderung, die in verschiedenen Port formData und ajax post-Methode

$('#upload-input').on('change', function() { 
var files = $(this).get(0).files; 
if (files.length > 0) { 
    var formData = new FormData(); 
    formData.append('directory', "path/to/directory"); 
    for (var i = 0; i < files.length; i++) { 
     var file = files[i]; 
     formData.append('uploads[]', file, file.name); 
    } 
    $.ajax({ 
     url: 'https://myurl.com:3000/upload', 
     type: 'POST', 
     data: formData, 
     processData: false, 
     contentType: false, 
     success: function(data) { 
      console.log(data); 
     }, 
    }); 
} 
}); 

Jetzt läuft die Datei sendet und in meinem Backend kann ich hochladen, dass formidable verwenden, aber das Problem ist, ich nicht den directory Wert bekommen kann, ist hier mein Code

require('dotenv').load(); 
var express = require('express'); 
var app = express(); 
var path = require('path'); 
var formidable = require('formidable'); 
var fs = require('fs'); 
var session = require('express-session'); 
app.set('views', __dirname + '/public'); 
app.use('/uploads', express.static(process.env.USER_UPLOADS)) 
var cors=require('cors'); 
app.use(cors({origin:true,credentials: true})); 
app.post('/upload', function(req, res) { 
    var user_folder = "path/to/directory/"; 
    var form = new formidable.IncomingForm(); 
    form.multiples = true; 
    form.uploadDir = path.join(__dirname, process.env.USER_UPLOADS + user_folder); 
    form.on('file', function(field, file) { fs.rename(file.path, path.join(form.uploadDir, file.name)); }); 
    form.on('error', function(err) { console.log('An error has occured: \n' + err); }); 
    form.on('end', function() { res.end('success'); }); 
    form.parse(req); 
}); 
var server = app.listen(3000, function(){ 
    console.log('Server listening on port 3000'); 
}); 

Ich versuchte

console.log(req.body) 

aber es gibt undefined, also wie kann ich den directory Wert von meinem Backend bekommen?

Vielen Dank im Voraus.

+1

Sie sehen in so etwas wie [dieser] (https://www.npmjs.com/package/express-fileupload) NPM-Paket? –

+1

Danke, es funktioniert für mich. –

+0

Ehrfürchtig. Froh das zu hören. –

Antwort

1

Um Ihr Problem zu beheben, habe ich einige Änderungen an der Server-Datei Ihrer Hauptanwendung , d. H. server.js/app.js/index.js jemand, der für Sie gilt. Siehe Änderungen unter:

require('dotenv').load(); 
var express = require('express'); 
var app = express(); 
var path = require('path'); 
var bodyParser = require('body-parser'); 
var formidable = require('formidable'); 
var fs = require('fs'); 
var session = require('express-session'); 
var cors=require('cors'); 

app.set('views', __dirname + '/public'); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cors({ origin:true, credentials: true })); 
app.use('/uploads', express.static(process.env.USER_UPLOADS)); 


app.post('/upload', function(req, res) { 
    var user_folder = "path/to/directory/"; 
    var form = new formidable.IncomingForm(); 
    form.multiples = true; 
    form.uploadDir = path.join(__dirname, process.env.USER_UPLOADS + user_folder); 
    form.on('file', function(field, file) { fs.rename(file.path, path.join(form.uploadDir, file.name)); }); 
    form.on('error', function(err) { console.log('An error has occured: \n' + err); }); 
    form.on('end', function() { res.end('success'); }); 

    // Note the changes here 
    form.parse(req, (error, fields, files) => { 
     console.log(JSON.stringify({ 
     fields, // { directory: "path/to/directory" } 
     files // contains the uploaded files 
    }), null, 2); 
    }); 
}); 


var server = app.listen(3000, function(){ 
    console.log('Server listening on port 3000'); 
}); 

Nach der Dokumentation bei here, form.parse eine optionale Callback-Funktion übernehmen kann.

Parses an incoming node.js request containing form data. If cb is provided, all fields and files are collected and passed to the callback:

form.parse(req, function(err, fields, files) { 
    // ... 
}); 
+0

Sorry, vielleicht war meine Frage nicht klar, also lassen Sie mich noch einmal klarstellen Von meinem js Skript sende ich die Verzeichnisadresse, wo die Datei speichert als formData.append ('Verzeichnis', "Pfad/zu/Verzeichnis"); und ich brauche diese Daten in meinem Backend, als 'var user_folder =" path/to/directory/";'. Eine andere Sache, ich weiß nicht warum, aber 'body-parser' und' formidable' arbeiten nicht zusammen. Dieser Vorgang läuft fast eine Minute und gibt "Error: Request abgebrochen" zurück. –

+0

Ich führe sogar 'console.log (req.body)' und 'console.log (form)' aus, kann aber den Wert meiner Verzeichnisvariablen nicht finden. –

+0

Bitte überprüfen Sie die bearbeitete Antwort erneut. –