Node.JS + Express анализ файла CSV на сервере - PullRequest
0 голосов
/ 14 февраля 2020

По сути, у меня есть форма, где пользователь будет загружать файл 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>

К вашему сведению: я использую get bootstrap .com в качестве таблицы стилей.

Теперь форма отправляет запрос POST на /upload, где мой node.js код есть. Мне нужно, чтобы сервер проанализировал этот файл CSV и извлек данные. Я понятия не имею, что делать, поскольку все различные NPM пакеты, такие как Multer, используют систему, в которой файл сохраняется локально, а затем анализируется.

Редактировать: Забыл упомянуть об этом, но временно локальный хостинг CSV не вариант. Мне нужен клиент, чтобы загрузить сервер для его обработки и pu sh в БД, я не могу нигде сохранить файл локально.

Редактировать 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

Так как же мне go из информации, предоставленной в атрибуте данных буфера, к фактическим данным?

1 Ответ

0 голосов
/ 15 февраля 2020

Все, что вам нужно, это Малтер. Multer вернет объект буфера, который вы можете затем создать строку с атрибутом .toString ().

Код:

const express = require("express");
const app = express();
var bodyParser = require("body-parser");
var multer  = require('multer');
var buffer = require('buffer/').Buffer
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);
});

...