【问题标题】:Upload file to Local directory as well as MongoDB将文件上传到本地目录以及 MongoDB
【发布时间】:2019-02-27 13:43:28
【问题描述】:

我在将文件同时上传到电脑和数据库时遇到问题。

我在我的代码中使用了两个不同的模块

  • Multer:用于从前端上传文件到 PC
  • CSV-to-JSON:用于将 CSV 文件转换为 json 以便将该文件存储在数据库中。

但是,使用两个单独的函数根本不是我的意图。 因此,当我尝试将这两个模块与基本代码结合起来时,使用 Multer 上传文件有效,但我想将该文件上传到 MongoDB,这需要通过 csv-to-json 对我来说是个问题,似乎没有任何效果。

这是我的代码:

var express = require('express');
var multer = require('multer');
const csv = require('csvtojson');
// Import Mongodb
const mongoClient = require('mongodb').MongoClient,
  assert = require('assert');

var filename = null;

var storage = multer.diskStorage({
  destination: function(req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function(req, file, cb) {
    filename = Date.now() + '-' + file.originalname;
    cb(null, filename)
    console.log(filename);
  }
})

var upload = multer({
  storage: storage
})

var app = express();

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

app.post('/', upload.single('file-to-upload'), function(req, res, next) {

  // Mongodb Connection URL 
  const url = 'mongodb://localhost:27017/csvfilereader';

  // Use connect method to connect to the Server
  mongoClient.connect(url, (err, db) => {
    assert.equal(null, err);

    if (db) {
      console.log("Connected correctly to server");

      insertDocuments(db, function() {
        db.close();
      });
    } else {
      console.log('\n', 'Problem with connection', err)
    }

  });

  const insertDocuments = (db, callback) => {
    // Get the documents collection
    let collection = db.collection('uploaded');

    // CSV File Path
    const csvFilePath = 'uploads/' + filename;

    console.log(csvFilePath);
    /**
     * Read csv file and save every row of
     * data on mongodb database
     */
    csv()
      .fromFile(csvFilePath)
      .on('json', (jsonObj) => {
        collection.insert(jsonObj, (err, result) => {
          if (err) {
            console.log(err);
          } else {
            console.log('suceess');
            res.redirect('/');
            filename = null;
          }
        });
      })
      .on('done', (error) => {
        console.log('end')
      })
  }

});

app.listen(3200);
<!--
HTML Code that runs on Root
-->

<html lang="en">
  <head>
    <title>Simple Multer Upload Example</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <form action="/" enctype="multipart/form-data" method="post">
      <input type="file" name="file-to-upload">
      <input type="submit" value="Upload">
    </form>  
  </body>
</html>

【问题讨论】:

    标签: node.js express mean-stack multer to-json


    【解决方案1】:

    您需要通过 multer 传递的请求来访问文件名。您的 filename 变量不指向任何对象。

    req.file.filename 将允许访问您已由 multer 上传的文件。

    更新代码:

    var express = require("express");
    var multer = require("multer");
    const csv = require("csvtojson");
    // Import Mongodb
    const MongoClient = require("mongodb").MongoClient,
        assert = require("assert");
    
    var filename = null;
    
    var storage = multer.diskStorage({
        destination: function(req, file, cb) {
            cb(null, "uploads/");
        },
        filename: function(req, file, cb) {
            filename = Date.now() + "-" + file.originalname;
            cb(null, filename);
        },
    });
    
    var upload = multer({
        storage: storage,
    });
    
    var app = express();
    
    app.get("/", (req, res) => {
        res.sendFile(__dirname + "/index.html");
    });
    
    app.post("/", upload.single("file-to-upload"), function(req, res, next) {
        // Connection URL
        const url = "mongodb://localhost:27017";
        console.log("Multer", req.file.filename);
        // Database Name
        const dbName = "csvreader";
    
        // Create a new MongoClient
        const client = new MongoClient(url, { useNewUrlParser: true });
    
        // Use connect method to connect to the Server
        client.connect(function(err) {
            assert.equal(null, err);
            console.log("Connected successfully to database");
    
            const db = client.db(dbName);
            insertDocuments(db, function() {
                console.log("Closing connection");
                client.close();
            });
        });
    
        const insertDocuments = (db, callback) => {
            // Get the documents collection
            const collection = db.collection("uploaded");
    
            // CSV File Path
            const csvFilePath = "uploads/" + filename;
    
            console.log("Reading file from ", csvFilePath);
            /**
             * Read csv file and save every row of
             * data on mongodb database
             */
            csv()
                .fromFile(csvFilePath)
                .then(jsonObj => {
                    console.log(jsonObj);
                    collection.insert(jsonObj, (err, result) => {
                        if (err) {
                            console.log(err);
                        } else {
                            console.log("suceess");
                            res.redirect("/");
                            filename = null;
                            callback();
                        }
                    });
                })
                .catch(err => {
                    //error reading file
                    console.log(err);
                });
        };
    });
    
    app.listen(3200, () => {
        console.log("Server working at port 3200");
    });
    

    【讨论】:

    • filename = Date.now() + '-' + file.originalname; 我的代码中的这一行为文件名分配了一个与上传文档的值相同的值,它显示了 CSV-to-json 将使用的相同名称,因为它需要 CSV 的路径要上传的文件。但我不知道如何使用回调函数。你可以解释吗 ?? @asghar-musani
    • 是的,req.file.filename 甚至会公开刚刚上传的同一个文件,这是一种使用而不是全局公开变量的好习惯。您的回调不会被执行,因为您需要在函数 insertDocuments 定义中使用回调。因此,您的 db.close() 永远不会被执行。我已经从您使用回调的地方更新了我的答案。要进一步了解回调,请阅读以下内容:What the hell is a callback?
    • 在我的系统中,文件名可能会重复,因此filename = Date.now() + '-' + file.originalname; 的使用有助于我区分它们,因为它将少量日期和时间参数与文件名合并。此外,在结合两个代码后,它既不连接到数据库也不获取文件(csv-to-json 模块的预期工作)。因此,下一步是执行回调,在此之前我需要帮助解决这个 CSV-to-JSON 模块问题
    • 我有时间运行您的代码并对其进行了修改。更新了代码的工作版本。知道现在我正在为mongodbcsvtojson 使用最新版本,因此Mongodb client 发生了变化
    • 您能提供您看到的错误类型吗?看到上传的文件了吗?代码的哪一部分不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多