2017-08-18 2 views
0

Hochladen ich den folgenden Code bin mit Leuten zu erlauben, Bilder auf einen Server hochladen:Knoten fs (Filestream) Erstellen von 2-Dateien, wenn einzelne Datei

app.post("/api/upload", function (req, res) { 

    fs.readFile(req.files[0].path, function (err, data) { 
    console.log('The data for the file..', data); 

    if (err) { 
     res.send(err).end(); 
    } else { 
     // ... 
     var newPath = __dirname + "/uploads/" + req.headers["account_id"] + '_' + moment().format('MM_DD_YYYY_HH-mm-ss') + '_' + req.files[0].originalname; 
     fs.writeFile(newPath, data, function (err) { 
     console.log('File Written'); 
     if (err) { 
      res.send(err).end(); 
     } else { 
      res.send({ 
      success: true, 
      file: newPath, 
      files: req.files 
      }).end(); 
     } 
     //res.end({"success": true}) 
     }); 
    } 
    }); 


}); 

Das Problem ist, dass für evey-Datei, die hochgeladen wird ich bin auch eine Arraybuffer-Version bekommen (glaube ich) sieht Bild:

enter image description here

Wie kann ich dies zu verhindern, und vor allem, warum geschieht das? Danke!

+0

Wird Ihre Datei erfolgreich in das Zielverzeichnis hochgeladen? –

+0

Verwenden Sie Multer oder etwas anderes, um Ihre Dateien hochzuladen? – Legman

+0

Ich verwende keine Multer –

Antwort

0

Es sieht für mich aus, als ob Sie die temporäre Upload-Datei und Ihre gespeicherte Datei sehen. Ihr Code sollte gut funktionieren, wenn Sie Code hinzufügen, um die temporäre Datei zu löschen (req.files [0] .path).

0

Wenn Sie Module wie multer verwenden, werden Dateiuploads normalerweise (permanent) auf der Festplatte gespeichert (es sei denn, Sie ändern den zugrundeliegenden Sicherungsspeicher unter multer). Also, wenn Sie die Datei lesen und es zurückschreiben, haben Sie eine Kopie.

Wenn Sie eine Kopie einer Datei erstellen müssen, ist dies nicht die effizienteste Lösung, da Sie den gesamten Inhalt im Speicher ablegen. Bis ein effizienterer Kopiermechanismus vorhanden ist, sollten Sie eine Streaming-Kopie erstellen (mit fs.createReadStream() und fs.createWriteStream()), um die Datenmenge im Speicher zu minimieren.

Wenn Sie stattdessen bewegen wollte/ die Datei umbenennen, dass multer auf der Festplatte gespeichert haben, dann können Sie entweder konfigurieren multer, so dass Sie zur Verfügung stellen und Zieldateinamen dynamisch (es ist so ein Haken vorhanden), oder Sie können fs.rename() verwenden, um die Datei anschließend zu verschieben oder umzubenennen.

+0

Können Sie Code zur Verfügung stellen? Ich möchte einfach die Datei von meiner API in einen Ordner namens uploads hochladen. Das ist es. –

1

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