Node.JS + 快速解析服务器上的 CSV 文件
Node.JS + Express parse CSV file on server
基本上,我有一个表单,用户可以在其中上传 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 作为我的风格 sheet。
现在,表单向 /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
那么如何从缓冲区数据属性中提供的信息到实际数据呢?
您只需使用 Multer。 Multer 将 return 一个缓冲区对象,然后您可以使用 .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);
});
基本上,我有一个表单,用户可以在其中上传 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 作为我的风格 sheet。
现在,表单向 /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
那么如何从缓冲区数据属性中提供的信息到实际数据呢?
您只需使用 Multer。 Multer 将 return 一个缓冲区对象,然后您可以使用 .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);
});