【问题标题】:Node.JS + Express parse CSV file on serverNode.JS + Express 解析服务器上的 CSV 文件
【发布时间】:2020-05-29 19:27:51
【问题描述】:

基本上,我所拥有的是用户将上传 CSV 文件的表单。

<form action="/upload" method="POST" enctype="multipart/form-data">
    <div class="custom-file">
        <input type="file" class="custom-file-input" id="customFile" name="file" required>
        <label class="custom-file-label" for="customFile">Choose file</label>
    </div>
    <input type="submit" class="btn btn-primary btn-block">
</form>

仅供参考:我使用 getbootstrap.com 作为我的样式表。

现在,表单向/upload 发送一个 POST 请求,这是我的 node.js 代码所在的位置。我需要让服务器解析这个 CSV 文件并提取数据。我不知道该怎么做,因为所有不同的 NPM 包(例如 Multer)都使用一个系统,在该系统中将文件保存在本地然后解析它。

编辑:忘记提及这一点,但临时本地 CSV 托管不是一个选项。 我需要客户端上传服务器来处理它并推送到数据库,无法将文件保存在本地任何地方。

编辑 2:我使用了 multer 和内存处理选项,得到了以下结果。

const express = require("express");
const app = express();
var bodyParser = require("body-parser");
var multer  = require('multer');
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(express.static("public"));

app.get("/", function(req, res) {
  response.sendFile(__dirname + "/views/index.html");
});
app.post("/upload", upload.single('file'), async (req, res) => {    
  res.send(req.file)
});
const listener = app.listen(process.env.PORT, function() {
  console.log("Your app is listening on port " + listener.address().port);
});

现在,一旦我上传文件,我会收到以下响应(这就是 req.file 的内容)。

{"fieldname":"file","originalname":"tech.csv","encoding":"7bit","mimetype":"application/octet-stream","buffer":{"type":"Buffer","data":[67,76,65,83,83,32,73,68,44,84,69,67,72,32,35,44,70,73,82,83,84,32,78,65,77,69,44,76,65,83,84,32,78,65,77,69,13,10,54,79,44,54,79,48,49,44,65,110,105,115,104,44,65,110,110,101]},"size":56}

所以很明显我们的数据恰好是

67,76,65,83,83,32,73,68,44,84,69,67,72,32,35,44,70,73,82,83,84,32,78,65,77,69,44,76,65,83,84,32,78,65,77,69,13,10,54,79,44,54,79,48,49,44,65,110,105,115,104,44,65,110,110,101

但是我该如何处理呢? csv文件数据是

CLASS ID,TECH #,FIRST NAME,LAST NAME
6O,6O01,Anish,Anne

那么如何从缓冲区数据属性中提供的信息转为实际数据呢?

【问题讨论】:

  • 通过搜索“npm parse cvs data in memory”然后单击 a Stackoverflow 问题,我花了不到一分钟的时间就找到了一个用于从数据而不是文件中解析 CVS 的库 然后到github.com/C2FO/fast-csv - 所以我很确定这实际上是Library Recommendations: NodeJs reading csv file 的副本
  • @Mike'Pomax'Kamermans 我正在寻找一种用户上传文件并立即处理它的方式,无需在任何地方存储/保存整个服务器。直接处理并存储在数据库中。
  • @AnishAnne — 在找到有关使用 MemoryStorage 而不是 DiskStorage 的部分之前,我只花了 30 秒浏览 Multer 文档。
  • @AnishAnne ...是吗?如果您阅读它们的文档,这就是所有这些库已经可以做的事情。它们可以“从文件”或“从内存变量中的数据”运行。所以要么你的问题是“我如何让上传只在内存中结束”(答案是“你绝对不会,除非你喜欢你的服务器被关闭。你真的想要临时文件”)或者你的问题是“我如何从内存中解析 CVS”在这种情况下:这些库。
  • 奇怪,我一定错过了。我再看一遍。

标签: node.js csv express export-to-csv


【解决方案1】:

您只需要使用 Multer。 Multer 将返回一个缓冲区对象,然后您可以使用 .toString() 属性创建一个字符串。

代码:

const express = require("express");
const app = express();
var bodyParser = require("body-parser");
var multer  = require('multer');
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(express.static("public"));

app.get("/", function(request, response) {
  response.sendFile(__dirname + "/views/index.html");
});

app.post("/upload", upload.single('file'), async (req, res) => {    
  var b = req.file["buffer"]
  console.log(b.toString())
  res.send(b.toString())
});

const listener = app.listen(process.env.PORT, function() {
  console.log("Your app is listening on port " + listener.address().port);
});

【讨论】:

  • npm 包和 var "buffer" 永远不会被调用,因此完全没用。
猜你喜欢
  • 2018-05-17
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 2021-07-11
  • 2017-09-10
相关资源
最近更新 更多