web-dev-qa-db-fra.com

comment télécharger et lire un fichier avec nodejs / express

il y a toutes sortes de messages à ce sujet, mais je ne comprends toujours pas. Je souhaite télécharger un * .csv et lire et traiter son contenu.

mon fichier de jade est-ce

//views/import.jade
extends layout
block content
h1= title
form(action="/import", method="post", enctype="multipart/form-data")
    input(type="file", name="ufile")
    input(type="submit", name="Upload")

-

J'ai changé le code, mais req.files n'est pas défini

//routes/index.js

/* import page. */
router.get('/blah', function(req, res, next) {
  res.render('import', { title: 'Import Data' });
});

router.post('/import', function(req, res) {
    console.log(req.files);
});


module.exports = router;
18
Simply Seth

Le tutoriel ci-dessous me permet de me rapprocher de l'endroit où je dois être.

REMARQUE: Dans le formulaire, il doit être:

action="/uploads/upload"

Je peux enfin télécharger et lire des fichiers * .csv.

http://blog.e-zest.com/how-to-handle-file-upload-with-node-and-express-4-0/

Voici l'un des ingrédients secrets pour lire les données du formulaire:

https://github.com/expressjs/multer

J'espère que cela peut être utile à quelqu'un d'autre qui a été coincé comme moi (pendant 3 jours!).

7
Simply Seth

Convertissez le fichier téléchargé en chaîne en utilisant

toString ('utf8')

vous pouvez alors effectuer n'importe quelle opération sur une chaîne comme la convertir en json en utilisant csvtojson package

Voici l'exemple de code pour télécharger csv et convertir en json-

/* csv to json */

const express = require("express"),
  app = express(),
  upload = require("express-fileupload"),
  csvtojson = require("csvtojson");

let csvData = "test";
app.use(upload());

app.get("/", (req, res, next) => {
  res.sendFile(__dirname + "/index.html");
});

app.post("/file", (req, res) => {
/** convert req buffer into csv string , 
*   "csvfile" is the name of my file given at name attribute in input tag */
  csvData = req.files.csvfile.data.toString('utf8');
  return csvtojson().fromString(csvData).then(json => 
    {return res.status(201).json({csv:csvData, json:json})})
});

app.listen(process.env.PORT || 4000, function(){
  console.log('Your node js server is running');
});

exemple de travail - csvjsonapi

6
Vino

J'espère que cela résout votre question, voici ma méthode pour télécharger plusieurs fichiers:

Nodejs:

router.post('/upload', function(req , res) {

var multiparty = require('multiparty');
var form = new multiparty.Form();
var fs = require('fs');

form.parse(req, function(err, fields, files) {  
    var imgArray = files.imatges;


    for (var i = 0; i < imgArray.length; i++) {
        var newPath = './public/uploads/'+fields.imgName+'/';
        var singleImg = imgArray[i];
        newPath+= singleImg.originalFilename;
        readAndWriteFile(singleImg, newPath);           
    }
    res.send("File uploaded to: " + newPath);

});

function readAndWriteFile(singleImg, newPath) {

        fs.readFile(singleImg.path , function(err,data) {
            fs.writeFile(newPath,data, function(err) {
                if (err) console.log('ERRRRRR!! :'+err);
                console.log('Fitxer: '+singleImg.originalFilename +' - '+ newPath);
            })
        })
}
})

Assurez-vous que votre formulaire contient enctype = "multipart/form-data"

J'espère que cela vous donne un coup de main;)

4
Despertaweb