首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用nestjs和Multer读取上传的文件(text/..csv)

如何使用nestjs和Multer读取上传的文件(text/..csv)
EN

Stack Overflow用户
提问于 2022-02-24 19:36:26
回答 1查看 3.6K关注 0票数 1

我需要读取控制器中的CSV文件,以便将CSV文件数据添加到我的DB中。但我不知道怎么做。我找了那么多次的答案,但我找不到一个相关的问题的答案。我真的需要你的帮助。谢谢。

我的主计长方法:-

代码语言:javascript
运行
复制
  @Post()
  @UseInterceptors(FileInterceptor('filename', { dest: './uploads' }))
  async upload(@UploadedFile() files: Express.Multer.File) {
    console.log(files);
  }

我的控制台日志输出:-

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 10:29:31

我刚刚完成了一个完全类似的场景。首先,我将csv文件上传到我的uploads/csv目录中,名为“data.csv”。

我使用这个库将数据解析为JSON

https://www.npmjs.com/package/nest-csv-parser

这里是我的控制器文件的核心。

代码语言:javascript
运行
复制
@Post('upload')
  @UseInterceptors(FileInterceptor('file', {
    storage: diskStorage({
      destination: './uploads/csv',
      filename: csvFileName,
    }),
    fileFilter: csvFileFilter,
  }))
  uploadFile(@UploadedFile() file: Express.Multer.File) {
    const response = {
      message: "File uploaded successfully!",
      data: { 
        originalname: file.originalname,
        filename: file.filename,
      }
    };
    return response;
  }

下面是我的组件app.module.ts的代码

代码语言:javascript
运行
复制
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Coin } from './coin.entity';
import { CoinsController } from './coins.controller';
import { CoinsService } from './coins.service';
import {CsvModule} from "nest-csv-parser";
import {MulterModule} from "@nestjs/platform-express";

@Module({
  imports: [
    TypeOrmModule.forFeature([Coin]),
      CsvModule,
    MulterModule.register({
      dest: './uploads/csv',
    }),
  ],
  controllers: [
    CoinsController,
  ],
  providers: [CoinsService]
})
export class CoinsModule { }

我还在utils或助手文件上创建了所有csv创建的逻辑

代码语言:javascript
运行
复制
import {extname, join} from 'path';

export const csvFileFilter = (req, file, callback) => {
    if (!file.originalname.match(/\.(csv)$/)) {
        return callback(new Error('Only CSV files are allowed!'), false);
    }
    callback(null, true);
};

export const csvFileName = (req, file, callback) => {
    //const name = file.originalname.split('.')[0];
    const fileExtName = extname(file.originalname);
    callback(null, `data${fileExtName}`);
};

export const getCSVFile = () => {
    //const name = file.originalname.split('.')[0];
    const filePath = join(__dirname, "..", "..", "uploads/csv", "data.csv");
    return filePath;
};

export const editFileName = (req, file, callback) => {
    const name = file.originalname.split('.')[0];
    const fileExtName = extname(file.originalname);
    const randomName = Array(4)
        .fill(null)
        .map(() => Math.round(Math.random() * 16).toString(16))
        .join('');
    callback(null, `${name}-${randomName}${fileExtName}`);
};

最后,我有一个不同的路径来导入或解析数据,然后我可以将它保存到数据库中。

代码语言:javascript
运行
复制
// You have to define entity that is as 2nd argument of csvParsing and also a mendatory.
class Coin {
  unix: number
  date: string
  symbol: string
  open: number
  close: number
  high: number
  low: number
  "Volume BTC": number
  "Volume USDT": number
  tradecount: number
}


// An import end route
@Get('import')
  async import(){
    const csvPath = getCSVFile();
    console.log(" => ", csvPath);
    const stream = fs.createReadStream(csvPath)
    const entities: Coin[] = await this.csvParser.parse(stream, Coin)
    // You will get JSON
    console.log(entities);
  }

您可以在相同的控制器动作/upload中这样做。尽管在我的场景中,我必须通过一个不同的API调用来完成它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71257348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档