2017-05-10 1 views
0

Ich versuche, eine Express-basierte API zum Hochladen von Dateien zu schreiben. Der Dateiname und der Verzeichnispfad sollten dynamisch festgelegt werden.Fehler beim Hochladen von Dateien mit Multer in NodeJs

Mein Code:

var crypto = require('crypto') 
var express = require('express'); 
var fs = require('fs'); 
var mime = require('mime'); 
var mkdirp = require('mkdirp'); 
var multer = require('multer'); 

var app = express(); 
var path = './uploads'; 

var storage = multer.diskStorage({ 
    destination: function (req, file, callback) { 
     callback(null, path); 
     console.log('Im in storage destination'+path); 
    }, 
    filename: function (req, file, callback) { 
     console.log('Im in storage filename'+path); 
     //callback(null, file.fieldname + '-' + Date.now()); 
     crypto.pseudoRandomBytes(16, function (err, raw) { 
      callback(null, Date.now() + '.' + mime.extension(file.mimetype)); 
     }); 
    } 
}); 

var upload = multer({ storage : storage}).single('userPhoto'); 

app.post('/photo',function(req,res){ 
    path += '/pics/shanmu/'; 
    console.log('Im in post , outside upload'+path); 

    upload(req,res,function(err) { 
     console.log('Im in post , inside upload'+path); 
     if(err) { 
      return res.end('Error uploading file.'); 
     } 
     res.end('File is uploaded'+path); 
     console.log('File is uploaded'+path); 
    }); 
}); 

app.listen(3000,function(){ 
    console.log('Working on port 3000'); 
}); 

Meine Ordnerstruktur:

Wenn ich den Code ausführen, sollte die Datei im uploads/ Ordner hochgeladen werden. (Dieser Ordner enthält zwei verschachtelte Ordner - uploads/pics/shanmu).

Wenn ich es vom Postboten ausgelöst habe, funktioniert es nur einmal. Wenn ich das zweite Mal versuche, kann ich keine Dateien hochladen.

Bitte beraten.

Antwort

0

Irgendwann habe ich eine Lösung mit multer Modul.Mit diesem Modul können Sie sowohl Dateien und Bilder hochladen. Und es erfolgreich in den Zielordner hochgeladen.

Hier ist mein Servercode app.js

var express =r equire('express'); 
var multer = require('multer'); 
var path = require('path') 
var app = express(); 
var ejs = require('ejs') 
app.set('view engine', 'ejs') 
var storage = multer.diskStorage({ 
    destination: function(req, file, callback) { 
     callback(null, './public/uploads')//here you can place your destination path 
    }, 
    filename: function(req, file, callback) { 
     callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)) 
    } 
}) 

app.get('/api/file',function(req,res){ 
res.render('index'); 
}); 
app.post('/api/file', function(req, res) { 
    var upload = multer({ 
     storage: storage}).single('userFile'); 
    upload(req, res, function(err) { 
     console.log("File uploaded"); 
     res.end('File is uploaded') 
    }) 
}) 

app.listen(3000,function(){ 
console.log("working on port 3000"); 
}); 

einen views Ordner erstellen und platzieren Sie diese index.ejs Datei in es

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
    <form id="uploadForm" enctype="multipart/form-data" method="post"> 
     <input type="file" name="userFile" /> 
     <input type="submit" value="Upload File" name="submit"> 
    </form> 
</body> 
</html> 

Danach den Server als node app.js .Open und geben Sie den Browser ausgeführt http://localhost:3000/api/file nach Runnig diese URL wählen Sie eine Datei, die Sie in den Zielordner hochladen möchten.Und haben eine erfolgreiche Antwort sowohl im Terminal als auch im Browser.Hope das hilft für Sie.

Verwandte Themen