web-dev-qa-db-ja.com

nodejs / expressでファイルをアップロードして読み取る方法

これについてはあらゆる種類の投稿がありますが、まだわかりません。 * .csvをアップロードして、その内容を読み取って処理したい。

私のヒスイのファイルはこれです

//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")

-

コードを変更しましたが、req.filesが未定義です

//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

以下のチュートリアルは、私が必要な場所に非常に近くなります。

注:フォームでは、次のようになります。

action="/uploads/upload"

ようやく* .csvファイルをアップロードして読み取ることができます。

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

フォームデータを読み取るための秘訣は次のとおりです。

https://github.com/expressjs/multer

私のように立ち往生した(3日間!)他の人にも役立つと思います。

7
Simply Seth

を使用して、アップロードされたファイルを文字列に変換します

toString( 'utf8')

csvtojson パッケージを使用して、それをjsonに変換するなどの操作を文字列に対して行うことができます

これはcsvをアップロードして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');
});

作業例- csvjsonapi

6
Vino

これがあなたの質問を解決することを願っています、これは複数のファイルをアップロードする私の方法です:

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);
            })
        })
}
})

フォームにenctype = "multipart/form-data"があることを確認してください

これがあなたに役立つことを願っています;)

4
Despertaweb