2016-04-07 5 views
8

Ich habe folgenden Code verwendet hochladen:wie Bilddatei und Anzeige mit ausdrücklicher NodeJS

fileupload.html

<html> 
<head> 
<title>File Uploading Form</title> 
</head> 
<body> 
<h3>File Upload:</h3> 
Select a file to upload: <br /> 
<form action="http://127.0.0.1:8081/file_upload" method="POST" enctype="multipart/form-data"> 
<input type="file" name="file" size="50" /> 
<br /> 
<input type="submit" value="Upload File" /> 
</form> 
</body> 
</html> 

fileupload.js:

var express = require('express'); 
var app = express(); 
var fs = require("fs"); 

var bodyParser = require('body-parser'); 
var multer = require('multer'); 

//console.log(multer); 

app.use(express.static('public')); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(multer({ dest: '/tmp/'})); 

app.get('/fileupload.html', function (req, res) { 
    res.sendFile(__dirname + "/" + "fileupload.html"); 
}) 

app.post('/file_upload', function (req, res) { 

    console.log(req.files.file.name); 
    console.log(req.files.file.path); 
    console.log(req.files.file.type); 

    var file = __dirname + "/" + req.files.file.name; 
    fs.readFile(req.files.file.path, function (err, data) { 
     fs.writeFile(file, data, function (err) { 
     if(err){ 
       console.log(err); 
     }else{ 
       response = { 
        message:'File uploaded successfully', 
        filename:req.files.file.name 
       }; 
      } 
      console.log(response); 
      res.end(JSON.stringify(response)); 
     }); 
    }); 
}) 

var server = app.listen(8081, function() { 
    var host = server.address().address 
    var port = server.address().port 

    console.log("Example app listening at http://%s:%s", host, port) 
}) 

Ich habe diese obigen Code verwendet Für das Hochladen von Dateien Aber wenn ich den Knoten fileupload.js im Terminal benutze, erhalte ich einen Typfehler TypeError('app.use() requires middleware functions');

Kann jemand helfen, dieses Problem zu lösen.

Antwort

8

Sie versuchen, die alte API multer zu verwenden. Es hat sich eine Weile geändert, siehe die documentation für weitere Informationen.

In Ihrem speziellen Fall eine einzelne Datei hochladen, würden Sie die app.use(multer({ ... })) Linie entfernen und stattdessen .single() verwenden und req.file wie:

var upload = multer({ dest: '/tmp/'}); 

// File input field name is simply 'file' 
app.post('/file_upload', upload.single('file'), function(req, res) { 
    var file = __dirname + '/' + req.file.filename; 
    fs.rename(req.file.path, file, function(err) { 
    if (err) { 
     console.log(err); 
     res.send(500); 
    } else { 
     res.json({ 
     message: 'File uploaded successfully', 
     filename: req.file.filename 
     }); 
    } 
    }); 
}); 
+0

Vielen Dank mscdex .File hochgeladen erfolgreich – Khushboo

+0

req.file nicht definiert ist? Wie kann ich das lösen? –

+0

@SunilGarg Stellen Sie sicher, dass Sie Ihr Bild in einem Feld namens "Datei" senden, wenn Sie auf Ihren Server veröffentlichen ... – duhaime

2

Multer fügt einen Körper Objekt und eine Objekt-Datei oder Dateien in der Anfrageobjekt Das Körperobjekt enthält die Werte der Textfelder des Formulars, das Datei- oder Dateiobjekt enthält die über das Formular hochgeladenen Dateien.

Verwenden Sie diesen Code, hoffe, dass dies Ihnen helfen wird.

var express = require('express'); 
var app = express(); 
var fs = require("fs"); 

var bodyParser = require('body-parser'); 
var multer = require('multer'); 

app.use(express.static('public')); 
app.use(bodyParser.urlencoded({ extended: false })); 
var upload = multer({ dest: '/tmp' }) 

app.get('/fileupload.html', function (req, res) { 
    res.sendFile(__dirname + "/" + "fileupload.html"); 
}) 

app.post('/file_upload', upload.single("file"), function (req, res) { 
    var file = __dirname + "/" + req.file.originalname; 
    fs.readFile(req.file.path, function (err, data) { 
     fs.writeFile(file, data, function (err) { 
     if(err){ 
       console.error(err); 
       response = { 
        message: 'Sorry, file couldn\'t be uploaded.', 
        filename: req.file.originalname 
       }; 
     }else{ 
       response = { 
        message: 'File uploaded successfully', 
        filename: req.file.originalname 
       }; 
      } 
      res.end(JSON.stringify(response)); 
     }); 
    }); 
}) 

var server = app.listen(8081, function() { 
    var host = server.address().address 
    var port = server.address().port 

    console.log("Example app listening at http://%s:%s", host, port) 
}) 
+0

Diese Lösung hat auch das Problem des Hochladens von Dateien behoben – Khushboo

0

Die obige Lösung für mich nicht so arbeitete ich verwendete Speichermethode haben:

var express = require('express'); 
var app = express(); 
var fs = require("fs"); 

var bodyParser = require('body-parser'); 
var multer = require('multer'); 

app.use(express.static('public')); 
app.use(bodyParser.urlencoded({ extended: false })); 

app.get('/index.htm', function (req, res) { 
    res.sendFile(__dirname + "/" + "index.htm"); 
}) 


var storage = multer.diskStorage({ 
    destination: function (req, file, cb) { 
     cb(null, './uploads/') 
    }, 
    filename: function (req, file, cb) { 
     var ext = require('path').extname(file.originalname); 
     ext = ext.length>1 ? ext : "." + require('mime').extension(file.mimetype); 
     require('crypto').pseudoRandomBytes(16, function (err, raw) { 
      cb(null, (err ? undefined : raw.toString('hex')) + ext); 
     }); 
    } 
}); 

var upload = multer({ storage: storage }); 

app.post('/file_upload', upload.any(), function (req, res, next) { 
    res.send(req.files); 
}) 
-1

Es scheint, dass es ursprünglichen Dateinamen oder die Erweiterung zu halten, und ich fand/diesen Code nicht sicher ist gemacht Bilder direkt überall Anzeige von JPG zu Ihrer Datei-uRL hinzufügen:

restapi.get('/uploads/:id', function (req, res) { 
    var storedMimeType = 'image/jpeg'; 
    res.setHeader('Content-Type', storedMimeType) 
fs.createReadStream(path.join('./uploads/', req.params.id).replace(/\.[^/.]+$/, "")).pipe(res) 
})